Hallo Leute!
Seit Wochen programmiere ich an der CAN-Schnittstelle des AT90CAN128
rum, jedoch lässt sich keine Nachricht empfangen. Nachrichten möchte
ich keine senden. Meine Vermutung ist, dass etwas mit der
Interupt-Vektortabelle nicht in Ordnung ist. Kann mir vielleicht jemand
weiterhelfen?
Im Anhang findet ihr meine main.c-Datei mit allen Initialisierungen...
Gruß
Thomas
Dann schalte ich mich mal auch noch mit ein:
Das Senden mit dem AT90CAN128 klappt bei mir ohne Probleme. Empfangen
lässt sich bis jetzt nichts (jeweils Polling).
Der einzige Interrupt, den ich zum Auslösen bekomme ist der des
CAN-Timers, dieser jedoch zuverlässig. Sowohl Sende- als auch
Empfangsinterrupt arbeiten nicht.
Habe es ausprobiert, jedoch funktioniert jetzt der Controller überhaupt
nicht mehr (SRAM-Error, auch mit meiner ursprünglichen main.c Datei)
@flyingwolf: Wie soll es ohne Interrupts funktionieren? Ich habe doch
nur 2 Möglichkeiten: entweder SIGNAL(...) oder INTERRUPT(...)
-> mit beiden habe ich keine nennenswerten Erfolge erzielt.
Den Fehler kann ich logischerweise nicht nachvollziehen.
Ohne Interrupts heißt das Ganze Polling.
Du kontrollierst einfach TXOK bzw. RXOK manuell und leitest bei
gesetzten Flags die entsprechenden Aktionen ein. Meine Senderoutine
demonstriert das ganze eigentlich.
Von INTERRUPT würde ich dir generell abraten.
@Thomas27
Ganz einfach. Du fragst die Box sporadisch ab. Du musst die Mailbox
nach jedem empfang explizit freigeben. Wenn Du Angst hast, dass Du
dadurch eine Nachricht verpassen könntest, kannst Du 2 Boxen mit den
gleichen Parametern freigeben. Dann kommt die erste Nachricht in der
ersten Box an und wenn die zeite Nachricht kommt, bevor die erste Box
wieder freigegeben ist, kommt die Nachricht in der zweiten box an. ...
Keine Verluste und keine Interrupts.
Danke @flyingwolf!
Das mit dem Polling klappt eigentlich ganz gut, jedoch scheint mit dem
CAN-Takt etwas noch nocht zu stimmen. Meine Einstellungen habe ich aus
der Tabelle der AT90CAN128-Anleitung (ca. Seite 261, Oszillatorfrequenz
4MHz).
Meine Wunschfrequenz ist 500 kbps -> CANBT1 = 0x00
CANBT2 = 0x04
CANBT3 = 0x13
Mit hilfe eines CANalyzer wollte ich dann eine Nachricht senden, die
mein Atmel empfangen und auswerten sollte (Übertragungsgeschw.
ebenfalls 500 kbps, sonst gehts ja nicht).
Nachdem ich mir jedoch die Nachricht mit dem Oszi angesehen habe,
musste ich (mit erschrecken :-) ) feststellen, dass Nachrichten, die
ich vom Atmel sende viel länger sind (3ms) als Nachrichten die ich vom
CANalyzer sende (ca. 120 us).
Gibt es da noch eine Möglichkeit der Konfiguration, um die Länge der
Nachricht zu kürzen?
ich takte mit 8MHz
Bei den CANBT hatte ich mich an die Vorlagen gehalten, weil ich noch
nicht rausbekommen habe wie das mit den Takteinstellungen
funktioniert.
Die Routine sendet CAN2B Du kannst es ändern indem Du auf 2A
umschaltest, dann ist der Identifierer nur 11 Bit lang statt 29
Was kann man eigentlich bei der USART Initialisierung bei diesem Ding
falsch machen?
void usart0_init (void)
{
UBRR0H = 0;
UBRR0L = 0;
UCSR0A = 0;
UCSR0C = (3<<1); //8N1
UCSR0B = (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0);
sei ();
}
SIGNAL (SIG_UART0_RECV)
{
//do something
}
Irgendwie wird der Interrupt nie ausgelöst (baudratenunabhängig).
OK, aus irgend einem Grund geht das jetzt auf dem USART0, identischer
Code auf dem USART1 arbeitet nicht. Irgendwie habe ich manchmal das
Gefühl, der Controller will mich veralbern :)
Beim ATMega8 bzw. 128 hatte ich sowas nie festgestellt, aber dieser
verhält sich irgendwie z.T. unberechenbar. Vielleicht werde ich auch
einfach nur senil ...
ich habe einen haufen ungereimtheiten festgestellt, in der Doku und den
Libs, die es dazu gab. Ich will nicht soweit gehen zu sagen dass es
Fehler sind, weil es ggf auch an mir liegt, aber es empfihlt sich immer
2 mal hinzuschauen und sich zu fragen ob das logisch ist, was in der
Doku steht. Ich habe monate damit zugebracht mich über den 90CAN128 zu
wundern. Bei den Ints war auch mal was krumm...
Ich weiß nicht wem ich die Schuld zuschieben soll:
- mir
- dem Controller
- dem gcc
Finde es halt nur irgendwie kurios, dass bestimmte Codefragmente einmal
funktionieren und ein anderes mal wieder nicht.
- LED mit blinkt mir 0,5Hz (Timerinterrupt)
- USART schickt jede Sekunde ein 'x'
- Main-Loop pollt auf Empfangsflag, gleichzeitig ist auch
Empfangsinterrupt aktiviert
- wird Flag erkannt bzw. Interrupt ausgelöst, werden Interrupts
deaktiviert
- die LED sollte also aufhören mit blinken
Bei der Hardware bin ich mir eigentlich sicher, dass sie passt
(MAX232), habe das identische schon mit einem ATMega128 aufgebaut. Wenn
ich längere Strings via Terminal sende erkenne ich am Multimeter einen
Spannungsabfall von 4,95V auf 4,6V (RXD1), ich gehe also mal davon aus,
dass Zeichen den MAX232 auch wieder verlassen.
ah ja, dann hängt bei mir an USART1 die serielle Schnittstelle. OK ich
habe keine Interrupts darauf aber die Schnittstelle arbeitet klaglos.
Allerdings habe ich keinen max232 dran.
Geht es denn ohne interrupt?
Offensichtlich nicht, da das Flag nicht gesetzt wird. Einzig der
Sendebetrieb scheint klaglos zu arbeiten. Werde morgen mal ein Oszi
dranhalten, im Zweifel liegt der Fehler immer beim Anwender.
Hallo!
Nur zur Info: Habe ein paar Fehler beseitigt...
Ein Fehler war, dass ein Fuse-Bit gesetzt wer, nämlich ein Vorteiler,
der die Grundfrequenz von 4Mhz geteilt runtergeteilt hat. Dieses hat
sich dann auch auf die Sendefrequenz des CANS's ausgewirkt.