Hallo,
ich verwende einen ATMega16, WinAVR und Ponyprog.
In einer Anwendung verwende ich den UART um Daten zwischen PC und uC
auszutauschen. Die Kommunikation geht interruptgesteuert, also mit
RXIE, TXIE usw...
In einer anderen Anwendung verwende ich einen Timer mit dessen Hilfe
ich ein paar Servomotoren steuere. Auch interrupt gesteuert. Beides
funktioniert einzeln sehr gut.
Wenn ich aber in meinem UART-Programm das Servosteuermodul einbauen
will funktionierts nicht. Ich bekomme keinen Datenaustausch mehr hin.
Ich hab auch schon heraus woran es ungefaehr liegt:
Ich initialisiere den UART und anschliessen den Timer (interrupt flags
setzen usw...). Wenn ich den Timer starte (CS-bits setzen) funktioniert
es nicht mehr. Wenn ich die Zeile mit TCCR2 |= ... wie unten
auskommentier funktioniert mein UART. Mit der Zeile funktioniert er
nicht.
//Initialization of UART
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
UCSRB |= (1<<RXEN) | (1<<TXEN); // enable RxD & TxD
UCSRB |= (1<<RXCIE) | (1<<TXCIE);// enable Rx- and Tx- interrupts
//Timer2 config (8bit)
TIMSK=0x00;
//TCCR2 |= (1<<CS22) | (1<<CS21) | (1<<CS20);
SETBIT(TIMSK, TOIE2); // overflow interrupt enable Timer2
Wo liegt da ein Zusammenhang?
Wo ist das Problem?
freue mich über Tips!
mg,
Johannes
Ohne halbwegs kompletten Quelltext wird Dir niemand helfen können. Bau
am besten mal ein lauffähiges Minimalbeispiel, um den Fehler zu
reproduzieren, oft findet man die Ursache dann auch selbst.
Eine Vermutung: Die Timer-ISR braucht zu lange, z.B. durch
Warteschleifen innerhalb der ISR, so daß die UART-Interrupts nicht
schnell genug bedient werden.
Was sind denn die Symptome für die fehlerhafte Übertragung? Rührt sich
gar nix, oder kommt nur Datenmüll an (z.B. auch Framing-Error), oder
gehen einzelne Zeichen verloren? Verwendest Du Ringpuffer für
eingehende und ausgehende Daten?
MfG Olaf
Hallo Olaf,
die ISR fuer den Timerueberlauf hab ich noch gar nicht eingebunden.
In meinem "Minimalbeispiel" hab ich einfach nur den Timer
initialisiert und gestartet wie im Quelltext oben. Das hat zur Folge,
dass der UART nicht mehr geht.
Inzwischen hab ich mit einema nderen Timer (16bit) gearbeitet und wenn
der läuft, egal ob mit oder ohne seine ISR, funzt der UART.
Ich poste gerne auch den ganzen Quellcode (bitte bescheid sagen!); aber
ehrlich: ich glaube kaum, dass sich jemand die Arbeit macht fuer mich in
meinem Code Fehler zu suchen...
mg,
Johannes
"die ISR fuer den Timerueberlauf hab ich noch gar nicht eingebunden."
Jo, dann gehts natürlich ab in den Wald.
Bevor man einen Interrupt freigibt, muß ein Handler am entsprechenden
Interruptvektor existieren !!!
Für diese Regel gibt es keine Ausnahme !!!
Peter
Aha!
ich nehm alles wieder zurück. Das hab ich nicht gewusst.
Dachte, der Timer laeuft dann vor sich hin...
hmm...Compilerspezialist bin ich nicht, aber sowas koennte der ja auch
merken, oder? ich nehm die Schuld aber ganz auf meinen Puckl,stell mich
5min in eine Ecke und schäme mich dreimal ganz laut!
es tut jetzt vorläufig wie ich will!
mg,
Johannes
> Einen Peter Dannegger im Forum zu haben ist Luxus. Ist nicht das> erstemal gewesen, dass dein Tip mich aufgeklaert hat. Danke,
Dem stimme ich voll zu!
...
ich auch.
Man sollte die Liste vielleicht noch verlängern (ohne Wertung in Bezug
auf die Reihenfolge:
Rufus, HanneS, Jörg Wunsch, OldBug, CrazyHorse.
Das sind die, die mir jetzt gerade eingefallen sind.