Hallo Elektronik-Begeisterte, ich arbeite hier mit einem AT90CAN128 und der CAN-Lib von kreatives-chaos.com: http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek Ich habe nun, wie scheinbar auch ein paar andere, das Problem, dass ich nur 15x senden kann und überhaupt nichts empfangen. Eine Ursache für das Problem könnte wohl ein fehlerhafte Verbindung zum RXCAN-Pin des AT90CAN128 sein. Ich habe die beiden Pins am Oszi gemessen (siehe Screenshot; gelb=TXCAN, magenta=RXCAN) und dies scheint nicht das Problem zu sein. Ist ist ja auch ein ACK zu sehen. Ich habe auch den entsprechenden Pin PD6 (PXCAN) in einemn kleinen Programm erfolgreich auf Zustandsänderungen getestet. Es scheint also auch etwas im Controller anzukommen. Ich betreibe den Controller an 3,3 V und benutze auch einen 3,3 V Bustreiber. Da das senden geht (wenn auch nur 15x), würde ich den 3,3 V Bustreiber erstmal als Fehlerursache ausschließen. Die Pegal zwischen AT90CAN und dem Bustreiber sehen ja auch gut aus?! Hat von euch jemand eine Idee wo das Problem liegen könnte? Gruß Jakob
... und beim Empfangen sieht es elektrisch doch auch OK aus (siehe Screenshot; gelb=TXCAN, magenta=RXCAN) !?
Der AT90CANxx hat 15 "Mailboxes". Fuers Empfangen muss man die Mailboxes konfigurieren. Es sieht aus, als ob etwas mit der Mailboxverwaltung nicht richtig ist...
OK ... aber warum kann ich nur 15 mal senden? Da scheint ja was mit dem ACK nicht zu stimmmen, oder?
Ja, die 15 Puffer werden voll sein, aber warum? Nach erfolgreichem senden sollten sie doch wieder freigegeben werden?
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdlib.h> |
4 | #include <util/delay.h> |
5 | #include <avr/wdt.h> |
6 | #include <string.h> |
7 | #include "can.h" |
8 | |
9 | |
10 | |
11 | int main (void) { |
12 | |
13 | |
14 | can_t msg; |
15 | |
16 | msg.id = 0x777; |
17 | msg.flags.rtr = 0; |
18 | |
19 | msg.length = 4; |
20 | msg.data[0] = 0xde; |
21 | msg.data[1] = 0xad; |
22 | msg.data[2] = 0xbe; |
23 | msg.data[3] = 0xef; |
24 | |
25 | can_init (BITRATE_250_KBPS); |
26 | can_disable_filter(0xff); |
27 | can_set_mode(NORMAL_MODE); |
28 | |
29 | do{ |
30 | |
31 | can_send_message(&msg); |
32 | _delay_ms(500); |
33 | |
34 | } while (1); |
35 | |
36 | return 0; |
37 | }
|
Das mit dem nur 15x Senden liegt doch meistens am nicht aktivierten Interrupt (sei()). Dann nämlich werden die Messageregister nicht mehr "freigeräumt".
Harald sei() danke geht das senden jetzt! :) Das Empfangen aber noch nicht :( Schau 'mer mal ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.