Leider, leider: Mein neuer ATMega644p lässt sich nun zwar programmieren, macht aber kein Reset nach dem Programmiervorgang. Auch scheint er das neue Prg nicht angenommen zu haben, obwohl mein STK500v2 sagt, dass der Flash Inhalt dem Hex File entspricht. Diesen Effekt hatte ich beim vorher eingesetzten ATmega32 nicht. Auch lässt sich der AVR durch einen Druck auf den RESET Taster am Mini-Mega-Board (Elektor) nicht zu einem Neustart bewegen. Hmmmm ! Wat nu? Danke für Hinweise!!! Viele Grüße Frank
Wie stellst du fest das es nicht läuft? Was hast du wo dran, kenn das Mini-Megaboard nicht.
Hallo Hubert,
Hubert G. schrieb:
> Wie stellst du fest das es nicht läuft?
Zum einen vertraue ich den avrdude Meldungen:
1 | avrdude: AVR device initialized and ready to accept instructions |
2 | |
3 | Reading | ################################################## | 100% 0.01s |
4 | |
5 | avrdude: Device signature = 0x1e960a |
6 | avrdude: safemode: lfuse reads as EE |
7 | avrdude: safemode: hfuse reads as 99 |
8 | avrdude: safemode: efuse reads as FD |
9 | avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed |
10 | To disable this feature, specify the -D option. |
11 | avrdude: erasing chip |
12 | avrdude: reading input file "psuctrl.hex" |
13 | avrdude: input file psuctrl.hex auto detected as Intel Hex |
14 | avrdude: writing flash (23816 bytes): |
15 | |
16 | Writing | ################################################## | 100% 33.84s |
17 | |
18 | avrdude: 23816 bytes of flash written |
19 | avrdude: verifying flash memory against psuctrl.hex: |
20 | avrdude: load data flash data from input file psuctrl.hex: |
21 | avrdude: input file psuctrl.hex auto detected as Intel Hex |
22 | avrdude: input file psuctrl.hex contains 23816 bytes |
23 | avrdude: reading on-chip flash data: |
24 | |
25 | Reading | ################################################## | 100% 30.19s |
26 | |
27 | avrdude: verifying ... |
28 | avrdude: 23816 bytes of flash verified |
29 | |
30 | avrdude: safemode: lfuse reads as EE |
31 | avrdude: safemode: hfuse reads as 99 |
32 | avrdude: safemode: efuse reads as FD |
33 | avrdude: safemode: Fuses OK |
34 | |
35 | avrdude done. Thank you. |
Zum anderen sehe ich nicht, dass meine Kontroll-LED, ein Lebenszeichen gibt. Wie gesagt: Mit dem ATmega32 geht das... Code-Auszug:
1 | void init_port_b ( void ) |
2 | {
|
3 | ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) |
4 | {
|
5 | DDRB |= (1<<PB0); // Set line 0 of port B as output |
6 | DDRB |= (1<<PB1); // Set line 1 of port B as output |
7 | DDRB |= (1<<PB2); // Set line 2 of port B as output |
8 | DDRB |= (1<<PB3); // Set line 3 of port B as output |
9 | DDRB |= (1<<PB4); // Set line 4 of port B as output |
10 | |
11 | // Heartbeat LED: Line 0 -> Switch off initially
|
12 | |
13 | PORTB &= ~( 1<<PB0 ); |
14 | |
15 | asm volatile ( "nop" ); // Give the AVR time to settle |
16 | }
|
17 | |
18 | return; |
19 | }
|
20 | |
21 | void set_error_led( void ) |
22 | {
|
23 | PORTB = PINB | (1 << PB0); |
24 | }
|
25 | |
26 | void clear_error_led( void ) |
27 | {
|
28 | PORTB = PINB & ~(1 << PB0); |
29 | }
|
30 | |
31 | void dit(void) |
32 | {
|
33 | clear_error_led(); |
34 | set_error_led(); |
35 | _delay_ms( 100 ); |
36 | clear_error_led(); |
37 | }
|
38 | |
39 | void dah( void ) |
40 | {
|
41 | clear_error_led(); |
42 | set_error_led(); |
43 | _delay_ms( 250 ); |
44 | clear_error_led(); |
45 | }
|
46 | |
47 | void roger( void ) |
48 | {
|
49 | dit(); |
50 | dah(); |
51 | dit(); |
52 | }
|
53 | |
54 | void init_io_timer ( void ) |
55 | {
|
56 | ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) |
57 | {
|
58 | // We use timer 1 (16 bit Timer) in CTC mode. This timer shall
|
59 | // generate an interrupt every PSU_IO_UPDATE_INTERVAL seconds.
|
60 | // Prescaler has to be set to 1 !
|
61 | |
62 | OCR1A = (unsigned short) |
63 | ((unsigned long) F_CPU / PSU_IO_IRQS_PER_SECOND / |
64 | PSU_IO_TIMER_PRESCALE - 1); // Load the timer compare value |
65 | |
66 | TCNT1 = 0; // Reset counter value |
67 | TCCR1A = 0; // No PWM |
68 | TCCR1B = _BV( WGM12 ) | _BV( CS11 ); // Set CTC mode |
69 | TIMSK0 |= _BV( OCIE1A ); // Output Compare A Interrupt |
70 | }
|
71 | }
|
72 | |
73 | rc_t greet( unsigned long nDelayMilliSeconds ) |
74 | {
|
75 | rc_t nRC = RC_OK; |
76 | |
77 | // Line 1: Title
|
78 | display_format( 1, strcpy_P( (char *) &acBuffer[0], PSTR( "* PSU + DARC *" ))); |
79 | |
80 | // Line 2: Model
|
81 | display_format( 2, strcpy_P( (char *) &acBuffer[0], PSTR( ">%6s< by DG1SBG" )), PSU_MODEL ); |
82 | |
83 | // Line 3 Serial Nr and Version
|
84 | display_format( 3, strcpy_P( (char *) &acBuffer[0], PSTR( "# %s - %s")), PSU_SERIAL_NR, PSU_VERSION ); |
85 | |
86 | roger(); |
87 | |
88 | if( nDelayMilliSeconds > 0 ) |
89 | _delay_ms( nDelayMilliSeconds ); |
90 | |
91 | return nRC; |
92 | }
|
93 | |
94 | ISR( TIMER1_COMPA_vect ) // Routine triggered by Timer 1 to |
95 | { // interact with the user |
96 | |
97 | heart_beat(); |
98 | |
99 | update_lamps(); // Update the lamp on/off to match relays |
100 | update_i2c_io(); // Read digital inputs and write relays |
101 | |
102 | // sample_voltages();
|
103 | |
104 | debounce(); // Debounce pushbuttons |
105 | |
106 | darc_get_command(); // Read command from DARC channel |
107 | }
|
108 | |
109 | |
110 | int main ( void ) |
111 | {
|
112 | rc_t nRC = RC_OK; |
113 | |
114 | // Status engine: Still outside of it
|
115 | |
116 | nCmdFromISR = NO_CMD; |
117 | bInStatusNetEngine = FALSE; |
118 | bPBsEnabled = FALSE; |
119 | |
120 | // Delay 2 seconds for all devices to settle
|
121 | |
122 | _delay_ms( 2000 ); |
123 | |
124 | // Do basic inits as fast as possible
|
125 | |
126 | init(); |
127 | execute_cmd_from_isr(); |
128 | |
129 | // Display the reason why the controller is booting
|
130 | |
131 | analyse_reset_reason( 1000 ); |
132 | execute_cmd_from_isr(); |
133 | blink_error_led_fast(); |
134 | |
135 | // Say hello on LCD
|
136 | |
137 | greet( 1000 ); |
138 | execute_cmd_from_isr(); |
139 | |
140 | // Make error logging in EEPROM possible
|
141 | |
142 | show_last_logged_error( 2000 ); |
143 | execute_cmd_from_isr(); |
144 | |
145 | // Kick off status net - THIS IS THE MAIN LOOP ...
|
146 | |
147 | bInStatusNetEngine = TRUE; |
148 | |
149 | clear_display(); |
150 | |
151 | switch_status( PSU_STATUS_ID_PSU_BOOTING ); |
152 | |
153 | while( nRC == RC_OK ) |
154 | {
|
155 | nRC = goto_next_status( nNextStatus ); |
156 | }
|
157 | |
158 | // When this point is reached it most likely means that a reset is
|
159 | // required !
|
160 | |
161 | if( IS_ERROR( nRC ) ) |
162 | log_error( nRC, __LINE__ ); |
163 | |
164 | reset(); // Reboot PSU Controller !!! |
165 | |
166 | // This point never reached ...
|
167 | return 1; |
168 | }
|
(Ich hoffe, das war nicht zuviel ...) > Was hast du wo dran, kenn das Mini-Megaboard nicht. LEDs sind an Port B dran. Die LED an PB0 sollte einmal für 1 Sekunde an sein und dann nochmal ein "kurz-lang-kurz" Blinken machen (Morse Buchstabe 'r'). Der ATmega644p zuckt aber nicht, d.h. er verharrt in dem Zustand, in dem er bei Beginn des Programmiervorgangs war. Danke für's Einspringen! Grüße, Frank
Also von einem einfachen "LED Blink Test" ist das ganze aber weit entfernt... ;) Ansonsten wo hast du den den Code her? Das sieht ja schrecklich aus.
1 | asm volatile ( "nop" ); // Give the AVR time to settle |
Was soll das den? Der AVR braucht doch keine Wartezeit zum setzen eines IO Ports. Die ganze atomic Block Geschichten kannst du dir auch sparen wenn du das ganze ausführst bevor du die Interupts freigibst (wo tust du das eigentlich)? debounce() in der ISR enthält doch hoffentlich keine Warteschleife? Also alles in allem etwas durcheinandcer, ich würde erstmal mit einem Simplen Programm testen ;)
Hi,
1 | void set_error_led( void ) |
2 | {
|
3 | PORTB = PINB | (1 << PB0); |
4 | }
|
5 | |
6 | void clear_error_led( void ) |
7 | {
|
8 | PORTB = PINB & ~(1 << PB0); |
9 | }
|
probiers mal mit
1 | void set_error_led( void ) |
2 | {
|
3 | PORTB |= (1 << PB0); |
4 | }
|
5 | |
6 | void clear_error_led( void ) |
7 | {
|
8 | PORTB &= ~(1 << PB0); |
9 | }
|
gruß
Das Mega32 und 644 zwar pinkompatibel, aber nicht in allen Funktionen sourcecodekompatibel sind, hast du aber beachtet, oder? http://www.atmel.com/dyn/resources/prod_documents/doc8001.pdf Oliver
Läubi .. schrieb: > Also von einem einfachen "LED Blink Test" ist das ganze aber weit > entfernt... ;) ;-) Stimmt. Ist die komplette Steuerung eines Hochspannungsnetzteils für meinen HF Verstärker. > > Ansonsten wo hast du den den Code her? Das sieht ja schrecklich aus. > >
1 | asm volatile ( "nop" ); // Give the AVR time to settle |
> Was soll das den? Der AVR braucht doch keine Wartezeit zum setzen eines > IO Ports. Ok. Selbst ohne diese Zeile benimmt sich der AVR aber immer noch gleich ;-) > > Die ganze atomic Block Geschichten kannst du dir auch sparen wenn du das > ganze ausführst bevor du die Interupts freigibst (wo tust du das > eigentlich)? An anderer Stelle. Siehe volles Listing anbei... > > debounce() in der ISR enthält doch hoffentlich keine Warteschleife? Nee. Wie kommst Du drauf ? > Also alles in allem etwas durcheinandcer, ich würde erstmal mit einem > Simplen Programm testen ;) Habe ich. Gleiches Verhalten. Es geht ja auch nicht um das Programm, sondern um die Tatsache, dass der ATmega644p nach dem Flashen keinen Reset ausführt und schlicht hängt. Ein Ausschalten und Einschalten des Boards lässt den AVR zwar neu starten, aber er scheint immer noch nicht das neue Programm auszuführen - als ob der Flash Vorgang gar nicht stattgefunden hätte. Mit dem ATMega32 funktioniert's - nur brauche ich mehr Speicher, deshalb kann ich den 32er nicht nehmen. Gruß, Frank
Oliver schrieb: > Das Mega32 und 644 zwar pinkompatibel, aber nicht in allen Funktionen > sourcecodekompatibel sind, hast du aber beachtet, oder? > > http://www.atmel.com/dyn/resources/prod_documents/doc8001.pdf Jau, habe ich. Ohne entsprechende Source-Anpassungen ließ sich der Code nicht übersetzen. Und ich habe genau dieses Dokument als Vorlage/Anleitung genommen. > > Oliver Danke! Gruß, Frank
Jean schrieb: > Hi, > >
1 | > void set_error_led( void ) |
2 | > { |
3 | > PORTB = PINB | (1 << PB0); |
4 | > } |
5 | >
|
6 | > void clear_error_led( void ) |
7 | > { |
8 | > PORTB = PINB & ~(1 << PB0); |
9 | > } |
10 | >
|
> > probiers mal mit > >
1 | > void set_error_led( void ) |
2 | > { |
3 | > PORTB |= (1 << PB0); |
4 | > } |
5 | >
|
6 | > void clear_error_led( void ) |
7 | > { |
8 | > PORTB &= ~(1 << PB0); |
9 | > } |
10 | >
|
Danke. Gemacht. Sieht etwas schöner aus ;-) Gruß, Frank
Es ist aus deinem Code nicht ersichtlich was an PortC hängt. Du hast JTAG nicht disabled. Vielleicht hängt sich dein Programm schon beim init auf.
Einfaches LED anschalten geht nicht?
1 | DDRB = 0xFF; |
2 | PORTB = 0xAA; |
3 | while(1) {} |
Sollte an PortB abwechseln High/Low ausgeben, kannst du einfach mit einem MM testen. Schonmal geprüft ob irgenwo ein Kurzschluss ist? (Machst du den Mega32 Test im selben Board?) ggf. Pullup an Reset mal versuchen.
Hubert G. schrieb: > Es ist aus deinem Code nicht ersichtlich was an PortC hängt. Du hast > JTAG nicht disabled. Vielleicht hängt sich dein Programm schon beim init > auf. Jau, so war das. JTAG nun disabled und siehe da, es geht. Vielen herzlichen Dank! Gruß, Frank P.S. Jetzt habe ich zwar schon das nächste Problem, aber das ist eine andere Geschichte und soll in einem anderen Thread erzählt werden.
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.