Re: Simple but wrong code
dfx <[email protected]>
| Newsgroups | gmane.comp.hardware.avr.gcc |
|---|---|
| Organization | dfx s.r.l. |
| Message-ID | <[email protected]> |
I would like to thank all those who, in various ways, have helped me to
solve my problem.
The changes, small but significant, were the abolition of reti () and
the use of PIND instead of PORTD for the reading the port.
thanks
Domenico Formenton
Tel. 06 92731757
Fax. 178 2250847
Cell. 333 7075929
Il 15/01/2014 02:18, Pink Boy ha scritto:
> dfx see notes below.
>
>
> // #define KEY_FUNC_SEL PIND4 // --> first key (Port D pin 4)
> // in WinAvr PIND4 is a bit position and is equal to 4
>
> #define KEY_FUNC_SEL (1<<PIND4) // resolves to 0x10
>
>
> ISR(PCINT3_vect) { // FUNCTION KEY
>
> uint8_t i;
>
> // i = PORTD;
> // PORTD is the output register for PORTD. To read the port pin
> state you need to read PIND
>
> i = PIND;
>
> if ((i & FUNC_SEL_KEY) > 0) { // Test a key
> LED_PORT |= (1 << PORTB0);
> _delay_ms(100);
> LED_PORT &= ~(1 << PORTB0);
> _delay_ms(300);
> }
>
> // reti(); <- this will mess up the stack because
> // the compiler handles restoring registers and the return from
> interrupt for you.
> }
>
> Matt
>
>
> ------------------------------------------------------------------------
> *From:* dfx <[email protected]>
> *To:* [email protected]
> *Sent:* Tuesday, January 14, 2014 8:54 AM
> *Subject:* [avr-gcc-list] Simple but wrong code
>
> Please consider this code:
>
> #define KEY_PORT PORTD
> #define KEY_DDR DDRD
> #define KEY_FUNC_SEL PIND4 // --> first key (Port D pin 4)
> ....
> #define LED_PORT PORTB // Test led, to see action on keypress
> ....
>
> #define FUNC_SEL_KEY 0x10 // First function --> first key (Port D pin 4)
> ....
>
> int main() {
> init();
>
> while (1) {
> // waits indefinitely for keypress
> }
> return (EXIT_SUCCESS); // Never reached
> }
>
> void init() {
> cli();
> LED_DDR |= (1 << DDB0); // Led out Port B pin 0
>
> KEY_PORT |= (1 << PORTD4) ; // pull-up resistor
> PCICR |= (1 << PCIE3); // Enable interrupts on PORTD (PCINT31:24)
>
> PCMSK0 = 0X00; // Disable unnecessary
> PCMSK1 = 0X00;
> PCMSK2 = 0X00;
> PCMSK3 |= (1 << PCINT28); // Enable key
> sei();
> }
>
> ISR(PCINT3_vect) { // FUNCTION KEY
> uint8_t i;
>
> i = PORTD;
> if ((i & FUNC_SEL_KEY) > 0) { // Test a key
> LED_PORT |= (1 << PORTB0);
> _delay_ms(100);
> LED_PORT &= ~(1 << PORTB0);
> _delay_ms(300);
> }
> reti();
> }
>
>
> ISR(BADISR_vect) {
> LED_PORT |= (1 << PORTB0);
> _delay_ms(200);
> LED_PORT &= ~(1 << PORTB0);
> _delay_ms(200);
> LED_PORT |= (1 << PORTB0);
> _delay_ms(200);
> LED_PORT &= ~(1 << PORTB0);
> _delay_ms(200);
> LED_PORT |= (1 << PORTB0);
> _delay_ms(200);
> LED_PORT &= ~(1 << PORTB0);
> _delay_ms(200);
> reti();
> }
>
> the button has a capacitor 1uF for debouncing (together with the pull-up
> from 10 kohm)
>
> The result is the following:
>
> when I press the button, are generated two flashes (instead of one),
> and when I release the button are generated two more flashes.
>
> Similarly, If I comment out the routine (ISR PCINT3_vect),
> the error routine (ISR BADISR_vect) generates double of the expected
> flashes.
>
> Can anyone help me to understand the problem?
>
> Thank you very much.
>
>
> --
> Domenico
>
>
>
> ---
> Questa e-mail è priva di virus e malware perché è attiva la protezione
> avast! Antivirus.
> http://www.avast.com <http://www.avast.com/>
> _______________________________________________
> AVR-GCC-list mailing list
> [email protected] <mailto:[email protected]>
> https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
>
>
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com
_______________________________________________
AVR-GCC-list mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
dfx.vcf
(text/x-vcard, 246 B)
begin:vcard fn:Domenico Formenton n:Formenton;Domenico org:dfx adr;dom:;;Via delle due Case, 12;APRILIA;LT;04011 email;internet:[email protected] tel;work:06 92500019 tel;cell:333 7075929 x-mozilla-html:TRUE url:www.dfx.it version:2.1 end:vcard