Hallo zusammen, versuche jetzt schon seit ca. 3 Tagen den ATmega162 zum laufen zu bringen aber er will einfach nicht. Ich verwende das AVR Studio v4.13 mit dem STK500 tool und einem JTAG ICE MK2. Ich habe zum Test zwei Programme geschrieben 1x in C und 1x in Assembler beide Programme schalten PortC Pin1 auf HIGH und wieder auf LOW. Das Brennen des Controllers Funktioniert, zumindest sagt mir das der STK500. Setting device parameters.. OK! Entering programming mode.. OK! etc... Diese Meldungen kommen beim JTAG-Mode sowie auch beim ISP-Mode, alles OK. Aber wenn ich das STK500 Fenster schliesse dann lieget am PortC Pin1 eine Permanente Spannung von ca. 2,3V an, es sollte aber zwischen 5V und 0V wechseln (denke mal das der Controller Steht!!! aber warum ????). Die Fuses sind so gesetzt: - Brown-out disabeld - JTAG Interface Enabeld - SPI prog download Enabeld - Boot Flash size 512 - Int RC Osc [CKSEL=0010 SUT=10] auch Externe 6MHz und 16 MHz getestet Es Funktioniert auch den Quelltext auf dem Controller im JTAG-Modus zu Debuggen. Bekommt der Controller den Takt über das Programmiergerät im Debug-Modus? Ich kann jede hilfe gut gebrauchen. Danke im voraus Gruß Dome PS: hier noch mal die beiden Quelltexte. Quelltext C: #include <avr/io.h> int main (void){ DDRC=0xff; PORTC=0x00; int wert01; int wert02; while(1) { for(wert01 = 0; wert01 <= 10; wert01++){ PORTC=0x01; } for(wert02 = 0; wert02 <= 10; wert02++){ PORTC=0x00; } }//end_while(1) }//end_main Quelltext ASM: .include "m162def.inc" ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 //------------------------- ldi r16,0xFF out ddrc,r16 AN0: ldi r18,0x00 AN: ldi r16,0x01 out portc,r16 inc r18 cpi r18,0x0F brne AN ldi r18,0x00 AUS: ldi r16,0x00 out portc,r16 inc r18 cpi r18,0x0F brne AUS breq AN0
>Aber wenn ich das STK500 Fenster schliesse dann lieget am PortC Pin1 >eine Permanente Spannung von ca. 2,3V an, es sollte aber zwischen 5V und Sieht doch korrekt aus:
1 | while(1) { |
2 | for(wert01 = 0; wert01 <= 10; wert01++) PORTC=0x01; |
3 | for(wert02 = 0; wert02 <= 10; wert02++) PORTC=0x00; |
4 | }//end_while(1) |
Du schaltest hier innerhalb weniger µs zwischen High und Low um - wenn du jetzt noch mit einem trägen Multimeter misst kommt da (0 V + 5 V) / 2 = 2,5 V raus. Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem Oszilloskop nach. Gruß Kai
>- JTAG Interface Enabeld Das ist der Fehler. Guck mal im Datenblatt, wo der JTAG-Port sitzt und wie man den im Programm abschaltet.
>Das ist der Fehler. >Guck mal im Datenblatt, wo der JTAG-Port sitzt und wie man den im >Programm abschaltet. PC0 hat doch nichts mit dem JTAG zu tun, oder? http://www.atmel.com/dyn/resources/prod_documents/doc2513.pdf
>PC0 hat doch nichts mit dem JTAG zu tun, oder? Ja, nee... War die typische Vermutung. Das Programm wird trotzdem etwas schnell laufen, um einen Pegelwechsel zu erkennen, wenn man nur ein Multimeter besitzt. Wenn man aber den JTAG ICE als Emulator benutzt und das Programm im AVRStudio per Einzelschritt durchtickert, sollte man schon noch was sehen.
Danke für die Schnellen Antworten. 1. "wie schnell läuft denn dein Controller ? Wenn der Controller mit dem Internen Quarz arbeitet sind es 8MHz. 2. "Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem Oszilloskop nach." Habe mal mit einem Oszilloskop gemessen ca. 2,3V DC. Des Weiteren habe ich die zählerwerte weiter rauf gesetzt. 3. "Das ist der Fehler. Guck mal im Datenblatt, wo der JTAG-Port sitzt und wie man den im Programm abschaltet." Warum sollte ich denn diesen Port abschalten? Es ist möglich in den Fuses (JTAG Interface Disabeld) JTAG Programmierung abzuschalten. 4. "PC0 hat doch nichts mit dem JTAG zu tun, oder?" Nein PC0 ist nur Port C Pin 0. 5. "Wenn man aber den JTAG ICE als Emulator benutzt und das Programm im AVRStudio per Einzelschritt durchtickert, sollte man schon noch was sehen." Habe im Einzelschritt mit einem Multimeter und mit einem Oszilloskop gemessen 5V/0V. Das geht alles aber nicht wenn ich den Quelltext in den Controller Brenne.
> 2. "Verwende zum Warten mal delay_ms() (oder so) oder miss mit einem > Oszilloskop nach." > Habe mal mit einem Oszilloskop gemessen ca. 2,3V DC. Des Weiteren > habe ich die zählerwerte weiter rauf gesetzt. Das kommt jetzt auf die Zählerwerte an, aber wenn du da nicht in die Millionen gegangen bist (*), dann wechselt der Pin sehr schnell zwischen 0 und 1. Daher auch die Messwerte. Probier mal das hier
1 | #define F_CPU 8000000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | void wait() |
7 | {
|
8 | unsigned char i; |
9 | |
10 | for( i = 0; i < 100; ++i ) |
11 | delay_ms( 10 ); |
12 | }
|
13 | |
14 | int main() |
15 | {
|
16 | DDRC = 0xff; |
17 | PORTC = 0x00; |
18 | |
19 | while(1) { |
20 | |
21 | PORTC = 0x01; |
22 | Wait(); |
23 | |
24 | PORTC = 0x00; |
25 | Wait(); |
26 | } //end_while(1) |
27 | } //end_main |
Das sollte deine LED an PC0 im Sekundentakt aufblinken lassen. Damit kannst du auch gleichzeitig überprüfen, ob dein µC tatsächlich auf 8Mhz läuft.
Endlich ich habe den µC am Laufen ^^. Es hatten sich 2 Fehler eingeschlichen zum einem in den Fuses und zum anderen in der Software. Alt: #include <avr/io.h> int main (void){ DDRC=0xff; PORTC=0x00; int wert01; int wert02; while(1) { <= Die While Bedingung mochte er nicht! for(wert01 = 0; wert01 <= 10; wert01++){<=10 war definitiv zu klein! PORTC=0x01; } for(wert02 = 0; wert02 <= 10; wert02++){ PORTC=0x00; } }//end_while(1) }//end_main Neu: #include <avr/io.h> int main (void) { DDRC=0xff; PORTC=0x00; long wert; do { wert = 0; while(wert < 50000) { PORTC=0x01; wert++; } wert = 0; while(wert < 50000) { PORTC=0x00; wert++; } }while(1); //end_while(1) }//end_main Gruß Dome
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.