Okay, jetzt sitze ich hier schon den ganzen Tag rum und habs nicht gebraten bekommen. Die Situtation stellt sich wie folgt dar: platine mit mega8 und TI max232 clone. ich lade also mein uart routine (von kreativ chaos entliehen) und schick das hex file dann (via stk200 eigenbau) in den flash. solange der isp stecker auf dem board steckt schauts so aus als wenn er dauernd resetten (in dem while(1) loop) würde (siehe hierzu auch den kommentar im link) und wenn ich den stecker runterziehe macht er garnichts bzw. im terminal wird der buchstabe den ich eintippe geechot, was aber nicht am programm liegen sollte - er mach also janüscht. der reset ist einmal am isp und einmal über widerstand an vcc. bitte auch den code hier angucken: http://pastecode.net/?action=viewpost&tag=1849 Beste Grüße Joghurt3000
Hi, irgendwie verstehe ich nicht was dein Problem ist und was passiert/nicht passiert. 1) du flasht den uC mit dem "Testprogramm" 2 a) wenn ISP noch drauf, dann erschient nichts am Terminal 2 b) wenn ISP ab, passiert auch nichts Das compiliert auch einwandfrei? Bilde mir ein, da fehlt bei UDR z.B. eine 0, also UDR => UDR0. Wie schaut's mit den Fuses (vor allem Clock Source) aus?
2 c) Wenn ISP drauf dann kommt was im Terminal andernfalls: tote Hose Ich weiß jetzt nicht ob Du Dir den Code samt Kommentar angeguckt hast, aber irgendwie scheint er den "while(1) { empfagen; senden; }" loop nur einmal zu durchlaufen und dann das programm neu zu starten. Ich habe den Code jetzt nochmal abgeändert (also nur den loop):
1 | int main() |
2 | {
|
3 | // initialisierung des UART etc. (...) - s.o. (pastecode link)
|
4 | |
5 | // rest:
|
6 | uint8_t c=0; |
7 | while(1) { |
8 | SEND(c + 'a'); |
9 | c++; |
10 | c = c % 25; |
11 | }
|
12 | return 0; |
13 | }
|
Der Output auf dem Terminal sieht dann so aus: abcdef"?"Hallo abcdef"?"Hallo abcdef"?"Hallo usw., wobei das "?" hier irgendein Wert ist den das Terminalprogramm nicht darstellen kann (und wie gesagt nur wenn der ISP-Stecker drauf ist sonst kommt garnichts). Fuses sind: lfuse=0xDF hfuse=0x99 und es ist ein 8MHz Quarz drauf an xtal1/2 mit 12pf gegen GND. MCU ist ein Mega8 16AU. Kompiliert einwandfrei: make flash avr-gcc -c -mmcu=atmega8 -I. -DF_CPU=8000000UL -D__AVR_ATmega8__ -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wno-strict-prototypes -Wundef -std=gnu99 main.c -o obj/main.o avr-gcc -mmcu=atmega8 -I. -DF_CPU=8000000UL -D__AVR_ATmega8__ -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wno-strict-prototypes -Wundef -std=gnu99 obj/main.o --output mugx.elf -Wl,-Map=mugx.map,--cref avr-objcopy -O ihex -R .eeprom mugx.elf mugx.hex /usr/local/avr/bin/avrdude -p m8 -c stk200 -U flash:w:mugx.hex (...) Beste Grüße und vielen Dank Quark Joghurt3000
Okay, es hat sich teilweise erledigt. Die Fusebits waren wohl nicht so optimal - hab sie jetzt auf (l:0xff & h:0xc9) gesetzt (wie immer man da auch aus dem Datenblatt schlau werden soll). Was als Probelm übrig belibt ist: Der macht nur was solange der ISP-Stecker verbunden ist, andernfalls läuft garnichts.
Hallo, kenne die HW nicht: Spannung bekommt der uC aber nicht über die ISP-Leitung, oder? ;=) Irgendwie passt dein Code ne zur Terminalausgabe... Sollte nicht erst das Hallo vor dem while kommen? Was macht wdt_disable() ? Wie gesagt: hier kompiliert das ganze nicht. Ansosnten: - Parity, Stopbit, Datenlänge Angaben im Terminal Programm stimmen? - stell die Baudrate mal am uC fest ein (hatte selber teilweise schon ein "verspieltes" makefile), d.h. UBRRH und -L direkt mit (Hex-)Werten nach Datenblatt beschreiben - mach mal an einen Pin eine LED (mehrere LEDs) und lass die toggeln, bzw. den Port hochzählen, bzw. läuft der uC überhaupt ohne/mit ISP Leitung? Viel Erfolg
Spannung bekommt der uC aber nicht über die ISP-Leitung, oder? Nein Spannung kommt vom Netzteil mit Spannungswandler auf Platine Irgendwie passt dein Code ne zur Terminalausgabe... Sollte nicht erst das Hallo vor dem while kommen? Ja, aber ich war leider nicht schnell genug um den Anfang zu erwischen und mein Terminalprogramm hat auch keinen entsprechend großen Puffer also hab ich einfach vom Anfang der Zeile rauskopiert (- ein '\n' kommt ja nur am Ende des "Hallo") Was macht wdt_disable() ? deaktiviert den Watchdogtimer, habe ich profilaktisch eingebaut ist wohl eher unwahrscheinlich das es von Nöten ist ... Also, wie bereits oben erwähnt funktioniert jetzt alles wie es soll allerdings nur wenn der ISP-Stecker verbunden ist mit dem Board. Stört mich momentan nicht sehr, da ich den ja sowieso brauche und ihn nicht jedes mal wieder aufstöpsle. Also der Reset ist wie gesagt über hochohmigen Widerstand an VCC. Potentialdifferenz zwischen GND und Resetpin = 5V (auch ohne ISP-Stecker). Also irgendwie muß der aufgesteckte ISP ja bewirken das es läuft - hat da jmd. 'n Tipp?
N'Abend, das Terminalprogramm kann ja die ganze Zeit laufen, solange der Controller im Reset ist/programmiert wird, kommen ja keine neuen Zeichen an. Und wenn am PC ein Puffer bei 9,6kBaud überläuft, solltest du ernsthaft über einen schnelleren PC nachdenken ;=) Der Watchdog ist normalerweise immer aus, es sei denn du schaltest ihn ein. Würde als nächstes die Potentiale von VCC, Reset, RX, TX am uC und VCC, Rx und Tx am Pegelwandler messen. Einmal mit aufgesteckter ISP Leitung, einmal ohne. Schon mal eine LED o.ä. angeschlossen nur um zu sehen ob der uC überhaupt ohne ISP Leitung läuft?
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.