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!
Läuft denn der ATmega128 auch wirklich mit 3.686 MHz oder vielmehr mit den 1 MHz des internen RC-Oszillators?
Hi, ich habs auf jeden Fall beim AVR Studio zum downloaden des Programmes eingestellt, falls man es sonst nirgens ändern kann sollte es passen!
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!
Gast
#438927
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... ;)
Gast
#438928
Wenn Du PORTA für diesen Zweck mit
1 | |
als Eingang definierst, solltest du auch die PullUps durch
1 | |
aktivieren.
Gast
#438929
1 | |
durch
1 | |
ersetzen.
Gast
#438931
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
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
Gast
#438973
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!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.