Hallo, Ich möchte gerne mehrere Steuergeräte über den vorhandenen CAN-Bus programmieren. In den Steuergeräten sind hauptsächlich AT90CAN128 verbaut. Freundlicherweise stellt Atmel ein Beispiel eines CAN-Bootloaders zur Verfügung: http://www.atmel.com/dyn/resources/prod_documents/at90CANLIB_3_2.zip Ich habe den Bootloader mittels ATDragon auf den AT90CAN128 geflasht. Einzige Änderung am Orginalcode war, dass ich den Pin eines Tasters, der gedrückt werden muss, damit der Bootloader startet, auf meine Schaltung angepasst habe. Ist noch kein Code im Application-Bereich startet immer der Bootloader. Beim Beschreiben der Application-Section wird ein Byte verändert, dass die Abfrage des Hardware-Pins aktiviert. Somit bleibt anfangs der Bootloader immer aktiv. Beschreibe ich den Application bereich (funktioniert einwandfrei), dann sollte der Bootloader nur noch bei gedrückter (Boot)taste aktiviert werden. Leider passiert da was seltsames. Manchmal startet die Application, manchmal der Bootloader, obwohl der Boottaster nicht gedrüclt wird. Hat jemand einen Tipp an was das liegen könnte? Ich habe die Fuses laut der Anleitung von Atmel programmiert (siehe Anhang) Der Code wurde mit WinAVR20070525 compiliert. Matthias
Matthias wrote: > > Leider passiert da was seltsames. Manchmal startet die Application, > manchmal der Bootloader, obwohl der Boottaster nicht gedrüclt wird. Klingt nach einem floatenden Eingang. Also kein Pull-Up/Down außen dran und auch den internen Pull-Up nicht aktiviert.
Hallo, Danke für die schnelle Antwort. der interne Pullup ist aktiviert. Hier mal ein Stück Code vom "Anfang" des Bootloaders:
1 | int main (void) |
2 | {
|
3 | U8 u8_temp; |
4 | U8 hwcb = FALSE; |
5 | Bool auto_b = 1; |
6 | |
7 | //! --- First of all, disabling the Global Interrupt
|
8 | Disable_interrupt(); |
9 | |
10 | //! --- If comming from RESET then test of the HardWare Condition Bit
|
11 | if (MCUSR != 0) |
12 | {
|
13 | //- Clear all reset flags
|
14 | MCUSR = 0; |
15 | //- Get HWCB (HardWare Condition Bit)
|
16 | DDRF &= ~(1<<0); // HWCB pin in input |
17 | if (HWCB_PULLUP_ON == 1) |
18 | {
|
19 | PORTF |= (1<<0); // Pull-up on HWCB |
20 | }
|
21 | hwcb = PINF; |
22 | if (HWCB_ACTIVE_LEVEL == 0) |
23 | {
|
24 | hwcb = ((~hwcb)&(1<<0)); |
25 | }
|
26 | |
27 | //- Start application else start boot loader
|
28 | u8_temp = get_conf_byte(BSB); |
29 | |
30 | if ( ((u8_temp!=BSB_DEFAULT)&&(hwcb==0)) || ((u8_temp==BSB_DEFAULT)&&(hwcb!=0)) ) |
31 | {
|
32 | isp_jump_to ( (((U16)get_conf_byte(SA_H))<<8) | ((U16)get_conf_byte(SA_L)) ); // Start application |
33 | }
|
34 | // else go to BOOT LOADER
|
35 | }
|
Kann es sein das trotz des internen Pullups, der Pin anfangs schwingt?
> der interne Pullup ist aktiviert.
Sicher?
Was ist HWCB_PULLUP_ON? Wieso wird das Aktivieren des Pullup von einer
Bedingung abhängig gemacht?
Noch was:
Die Zeit zwischen Aktivieren des Pullup und Einlesen des Pins ist
reichlich kurz.
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.