Hallo,
versuche heute schon den ganzen Tag ein Programm zum laufen zu bringen,
welches vom Mega128 Daten an den PC sendet, aber leider empfange ich im
Hyperterminal gar nichts! Verwende dafür STK500 + STK501, dabei wird der
RS232 Spare2 am STK501 verwendet, habe daher folgende zwei Brücken
gemacht:
STK501 RXD -> STK500 PortD2 (müßte der UART1 RXD Ausgang vom Mega128
sein)
STK501 TXD -> STK500 PortD3 (müßte der UART1 TXD Ausgang vom Mega128
sein)
Code hab ich euch online gestellt, müßte eigentlich passen. Hab ich
irgendwas zum überbrücken vergessen, oder falsch gemacht? Kabel nehm ich
das selbe wie beim Programmieren, wird nur umgesteckt. Mega103 Komp.
habe ich ausgeschaltet, ebenso JTAG.
Es erlischt und leuchtet wenigstens mal die LED0 am Board, wenn ich
irgendwelche Buchstaben im Hyperterminal eintippe (komisch zwar, dass
sich nur bei einer LED was tut), also ganz tot scheint die Leitung nicht
zu sein.
Bin echt verzweifelt, bitte um Hilfe!
Du musst den ATmega128 mit der Fuse auf externen Takt stellen, sonst
läufst du auf dem internen Oszillator.
Steht übrigens auch in der avr-libc-FAQ. ;-)
Hi,
habe ich auch schon gemacht, aber geholfen hat es eigentlich nichts, da
ich nicht genau weiß, welches ich auswählen soll!
Ich habe es mal mit folgendem probiert:
Ext. RC 0sc. 3 - 8 Mhz 6CK + 4ms
Soll ich einen anderen verwenden und wenn ja, welchen?
Keinen externen *RC*-Oszillator, sondern eine externe Takteinspeisung.
Numerisch ist die low fuse dafür 0xE0, aber mit dem AVR Studio kannst
du es nicht numerisch einstellen.
Könntest du mir das etwas genauer erläutern, hab leider jetzt gar keinen
Durchblick mehr wie ich das hinbekommen soll!
Brauch ich da noch zusätzliche Hardware, oder geht das alles per
software?
Wenn du einen STK500+501 hast, brauchst du keine zusätzliche
Hardware.
Ich kenn mich mit AVR Studio nicht aus, da ich kein Windows habe.
Aber irgendwie, wenn du im Programmierdialog bist und die Fuses
liest, zeigt es dir doch unten die aktuellen Werte hexadezimal
an. Dort sollte für die low fuse ein 0xE0 stehen.
Hi,
du hast mir das Leben gerettet, habe jetzt Ext. Crystal/Resonator High
Freq. 1K CK + 0ms eingestellt und es läuft endlich. Bin ich froh, dann
war der ganze Tag doch nicht für die Katz!
DANKE.
Hab jetzt immer noch ein kleines Problem und zwar habe ich mein Programm
jetzt so programmiert, dass ich durch drücken einer der Taster am STK500
einen Text zum PC übertrage und zwar mittel Interrupt. Die Übertragung
klappt auch, aber nur beim ersten drücken einer Taste, drücke ich
nachher noch einmal eine Taste, so tut sich nichts mehr. Im Simulator
hat es funktioniert, bin etwas ratlos!
Wäre schön, wenn mir jemand helfen könnte!
1. Fehler:
volatile uint8_t head;
(...)
head=-1;
Warum deklarierst du "head" als unsigned(!) int und weist ihr dann einen
signed(!) Wert von -1 zu? Müsste da nicht schon der Compiler meckern?
Gruß,
Magnetus
P.S.: Ich such mal noch ein wenig weiter nach Fehlern... ;)
cli() und sei() haben in der init_usart1 NICHTS zu suchen!!!
sei() steht ohnehin in der main() unmittelbar nach dem Aufruf der
init_usart1().
So... das wars vorerst mal von meiner Seite. Übernimm mal die genannten
Änderungen in dein Programm und gib dann bescheid, wie es gelaufen ist.
Gruß,
Magnetus
ISR(USART1_RX_vect)
{
head++;
buffer[head] = UDR1;
if(head > 15)
head = 0;
}
Das geht so nicht, damit schreibst du in buffer[16] und das ist
ausserhalb des arrays
Gruß
Walter
@Magnetus:
Hi,
danke für deine Anregungen, bin noch Anfänger, daher tue ich mir bei
manchen Sachen noch etwas schwer!
Habe deine Änderungen übernommen, aber leider ist das Verhalten immer
noch wie vorher, die Ausgabe funktioniert nur beim ersten drücken der
Taste!
@Walter:
Habe den Code jetzt umgeschrieben auf diese Version:
ISR(USART1_RX_vect)
{
head++;
if(head >15)
{
head = 0;
}
buffer[head] = UDR1;
}
Mit dem head nicht mehr als unsigned int, jetzt müßte es passen!