Das war also das was ich nicht wusste, wieder was dazu Gelernt !
Herzlichen Dank ! Dann werd ich mich jetzt mal mit CTC auseinandersetzen....
Mfg Fugitivus
Das war also das was ich nicht wusste, wieder was dazu Gelernt !
Herzlichen Dank ! Dann werd ich mich jetzt mal mit CTC auseinandersetzen....
Mfg Fugitivus
Habs mal mit 38400 Baud getestet funktioniert wunderbar....
mal gucken wie sowas mit ctc aussieht.....Code:#include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #include <util/delay.h> #include "init.h" #include "lcd.h" //SoftUART PINS #define RXPIN 2 #define RXINT INT0 #define UARTDDR DDRD #define UARTPIN PIND #define UARTPORT PORTD #define T0REL 204 #define T0WAIT 48 char iOut[20]; unsigned char sFlag = 0; unsigned char bitCnt = 0; unsigned char udr = 0; void cfgInt0(void) { MCUCR |= (1<<ISC01); //INT0 falling edge GICR |= (1<<INT0); //INT0 interrupt enable } void cfgTimer0(void) { TCNT0 = T0WAIT; TCCR0 = 1; //pre = 1 //TIMSK |=(1<<TOIE0); } void cfgSoftUart(void) { UARTDDR &=~ (1<<RXPIN); //RX Pin als Input UARTPORT &=~ (1<<RXPIN); //RX Pin auf 0 cfgInt0(); //Software UART Interrupt cfgTimer0(); //Software UART Timer } int main(void) { cfgPorts(); cfgSoftUart(); cfgLcd(LCD_ON_CURSOR_OFF); lcdCls(); enableInterrupts(); _delay_ms(200); lcdPrint("Software Uart",1,1); while(1) { itoa(udr,iOut,10); lcdPrint(" ",1,3); lcdPrint(iOut,1,3); itoa(udr,iOut,2); lcdPrint(iOut,5,3); _delay_ms(1000); } return 0; } ISR(INT0_vect) { GICR &=~ (1<<INT0); TCNT0 = T0WAIT; TCCR0 = 1; TIFR |= (1<<TOV0); TIMSK |=(1<<TOIE0); } ISR(TIMER0_OVF_vect) { TCNT0 = T0REL; if(sFlag == 0) { sFlag = 1; TCCR0 = 2; }else { if(!(PIND & (1 << PD2))) { udr &=~ (1<<bitCnt++); }else { udr |= (1<<bitCnt++); } } if(bitCnt == 8) { bitCnt = 0; sFlag = 0; TIMSK &=~(1<<TOIE0); GIFR |= (1<<INTF0); GICR |= (1<<INT0); } }
noch mal super herzlichen dank !
mfg Fugitivus
Das ist nicht korrekt. Damit löscht du gleich alle gesetzten Flags in dem jeweiligen Register. Bei deinem aktuellen Code ist es egal, ob nur ein bestimmtes Flag gelöscht wird, oder gleich alle, aber wenn du deinen Code dann mal erweiterst und mehr Interrupts benutzt, dann wird dich das irgendwann in den Hintern beißen.Code:TIFR |= (1<<TOV0); GIFR |= (1<<INTF0);
MfG
Stefan
Erst mal Danke für den Hinweis !
verstehe ich nicht so ganz.... weil ich es rein shifte ?
also im Datenblatt steht doch clear durch schreiben einer 1 für das entsprechende flag....
also statt
besserCode:GIFR |= (1<<INTF0);
bitte um genauere ErklährungCode:GIFR |= 64; //???
Hier noch mal Datenblattauszug:
• Bit 6 – INTF0: External Interrupt Flag 0
When an event on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the Ibit
in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag
can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured
as a level interrupt.
würde mich sehr freuen wenn du mir das genau erklährst...
Mfg Fugitivus
Ausgeschrieben bedeutet es
GIFR = GIFR | 64;
und bewirkt, daß alle beim Auslesen von GIFR gesetzten Bits auch wieder geschrieben und deshalb mitgelöscht werden.
"...the flag can be cleared by writing a logical one to it." mit |= betrifft alle zu diesem Zeitpunkt gesetzten Flags!
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
also nen logisches & ?
sprich (wenn ich das richtig verstanden habe):
1100 0000
0100 0000 AND
0100 0000 =
Lesezeichen