Forum: Mikrocontroller und Digitale Elektronik UART/Reset/ISP Problem


von Joghurt3k (Gast)


Lesenswert?

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

von Quark mit Soße (Gast)


Lesenswert?

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?

von Joghurt3k (Gast)


Lesenswert?

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

von Joghurt3k (Gast)


Lesenswert?

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.

von Quark mit Soße (Gast)


Lesenswert?

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

von Joghurt3k (Gast)


Lesenswert?

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?

von Quark mit Soße (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.