Tag Jungs, brauche eure Hilfe. Alle Tipps sind herzlich willkommen. Man bedankt sich. Habe vor, ein paar Werte einzulesen und dann an PC zur Weiterbearbeitung zu schicken. Eine abgespeckte Version ist im Anhang. Bitte schaut euch das an und sagt mir wo ich die Fehler gemacht habe. Da sind sicherlich viele. Also alle bitte mal rein schauen. Vielen Dank
Habe noch mal Mist gebaut. richtige Version ist unten. Danke. # include <avr/io.h> # include <math.h> # include <stdlib.h> # include <stdint.h> uint8_t qvi; uint8_t pi; uint8_t ti; int main (void) { ADCSRA |= (1<<ADEN | 1<<ADPS2 | 1<<ADPS1); ADMUX |= (1<<REFS1 | 1<<REFS0 | 1<<ADLAR); ADCSRA |= (1<<ADSC); while ((ADCSRA & (1<<ADSC))) { qvi=ADCH; } ADMUX |= (1<<MUX0); ADCSRA |= (1<<ADSC); while ((ADCSRA & (1<<ADSC))) { pi=ADCH; } ADMUX |= (1<<MUX1); ADCSRA |= (1<<ADSC); while ((ADCSRA & (1<<ADSC))) { ti=ADCH; } UBRRH = 0; //Baud Rate bei 2MHz 2400 UBRRL = 51; //siehe Tabelle UCSRB = (1<<TXEN); // nur senden UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0); // 8 bits, 2 Stop bits while (!(UCSRA & (1<<UDRE))) {} UDR = qvi; while (!(UCSRA & (1<<UDRE))) {} UDR = pi; while (!(UCSRA & (1<<UDRE))) {} UDR = ti; return 0; // Herzlichen Dank!! }
Wenn du uns jetzt noch sagst, was denn nu das Problem mit diesem Code ist, dann würden wir auch wissen wonach wir den Code durchstöbern könnten. Funktioniert die USART nicht? Kriegst du seltsame Messwerte? Oder was?
Erstmal vielne Dank für deinen Hinweis. Hab nicht daran gedacht. Code wird ohne Fehler compiliert. (AVR Studio 4) Diese Werte sollen bei Visual Basic ankommen und bearbeitet werden. Ich bekomme aber keinen Wert an Seriellem Port von PC. Kann mir vielleich jemand sagen, wo ich die Werte sonst noch am PC finde. Nicht mal das weiß ich. Hilfe...
Shoutian Huang wrote: > Diese Werte sollen bei Visual Basic ankommen und bearbeitet werden. > Ich bekomme aber keinen Wert an Seriellem Port von PC. > > Kann mir vielleich jemand sagen, wo ich die Werte sonst noch am PC > finde. > Nicht mal das weiß ich. Hilfe... Serieller Port ist schon ok. Aber in deiner Konfiguration gibt es erst mal eine Unmenge an möglichen Fehlerquellen. Also heist es erst mal abspecken und eine einfachere Variante des Programms schreiben um Fehler eingrenzen zu können:
1 | #include <avr/io.h> |
2 | |
3 | int main (void) |
4 | {
|
5 | UBRRH = 0; //Baud Rate bei 2MHz 2400 |
6 | UBRRL = 51; //siehe Tabelle |
7 | UCSRB = (1<<TXEN); // nur senden |
8 | UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0); // 8 bits, 2 Stop bits |
9 | |
10 | while( 1 ) { |
11 | while (!(UCSRA & (1<<UDRE))) |
12 | {}
|
13 | UDR = 'x'; |
14 | }
|
15 | }
|
Das sendet laufend ein 'x' über die Serielle Schnittstelle. Anstatt mit VB hängst du dich jetzt erst mal mit Hyperterminal (oder einem anderen Terminalprogramm) an die serielle Schnittstelle und siehst zu, ob da die 'x' alle auftauchen. Mögliche Fehlerquellen * Das Kabel könnte verkehrt rum sein. Anstelle von gekreuzt ist es nicht gekreuzt oder umgekehrt * Deine 2Mhz klingen verdächtig Ohne einen externen Quarz ist eine USART Verbindung ein Glücksspiel. Falls das wirklich ein 2 Mhz Quarz ist, solltest du mal einen Baudratenquarz in Erwägung ziehen. Bei 2Mhz wird die UART Taktrate einen Fehler aufweisen. Ich habe jetzt nicht nachgerechnet, aber wenn der Fehler über 3% liegt, dann wird die UART nicht funktionieren. * Alles mögliche sonstige: Mit einem Voltmeter mal das Signal auf deinem µC Bord verfolgen und nachsehen ob es am Kabel richtig hineingeht, bzw. am anderen Kabelende wieder richtig herauskommt. Daher auch die Endlosschleife beim Senden. Wenn du mehr weist, dann melde dich nochmal. Aber im Moment gibt es einfach zuviele Fehlermöglichkeiten als dass man dir sinnvoll helfen könnte.
Vielen Dank für deine Hilfe. Ich probiere es aus. Die Angabe von 2 Mhz habe ich vertan. 16MHz ist es. Kommentar entstand vor einer Woche.
@ Shoutian Huang > 16MHz > UBRRL = 51; > UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0); // 8N2 Serielle Schnittstelle am PC muss also auf 19200 Baud (8N2, ist aber ungewöhnicher Wert, gängiger ist 8N1...) eingestellt sein. Ist das so? Stimmt das Visual Basic Programm? Wenn du da unsicher bist, nimm ein fertiges Terminalprogramm. Wenn du ASCII-Zeichen erwartest (Vorschlag von Karl heinz Buchegger( reicht Hyperterminal von Windows. Wenn du beliebige Zeichen erwartest (so wie dein µC Programm sie sendet), nimm ein Terminal mit Hex-Anzeige (http://www.mikrocontroller.net/articles/RS-232#Windows) Nebengefechtsschauplatz: Du solltest deine Arbeitsanweisungen in eine Endlosschleife packen, so wie es Karl heinz Buchegger mit der while(1) Schleife macht. main darf bei µCs nicht zurückkehren (Wohin auch? Direkt in den Reset?).
@ Stefan and Karl Vielen Dank für die wertvollen Tipps. Werde mich anstrengen, in die Materie einzuarbeiten. Erlaubt mir bitte, dass ich euch noch mal kontaktiere. Danke.
Was hindert dich? Schreib doch einfach deine Fragen HIER (ins Forum) hin. Vielleicht haben andere ähnliche Fragen oder jemand kennt bessere Antworten als ich.
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.