Guten Abend zusammen, habe gerade die ersten Schritte mit einem STK500 und einem ATMEGA16 hinter mich gebracht.Nachdem ich jetzt weis, dass es fusebits gibt und diese doch ab und an angefsst werden müssen,versuche ich wieder eine Serielle Kommunikation zwischen STK500 und einen PC, via RS232 Schnittstelle zu realisieren. Soll: Ausgabe von Werten die mittels 50k Poti ((+) (Schleife an PA0) (-)über den ADC eingelesen werden, übermittelt von RS232 (Spare) an PC. Problem: Am PC werden Zeichen dargestellt und das gesamte AVR_Terminal vollgeschrieben. Das Programm kommt aus dem AVRBUCH.de, heißt EasyADC und soll Werte in den ADC einlesen und an den PC senden. Mit dem Atmega8 funktioniert es auch. Leider nicht mit dem ATmega16 :-( Was bisher probiert wurde: mit dem Atmega16 funktionierte die serielle Schnittstelle Mit dem Programm aus dem AVR_Buch "SERIELLMINIMAL" wird der Text "AVRBUCH.DE - RS232 [OK]..." übertragen. Was ich verändert habe: Atmega8 raus, Atmega16 rein auf Steckplatz A03 und ADC Eingang auf PA0 gesteckt. RS 232 Verbindungskabel ist auf RxD, PD0 von PORTD, TxD auf PD1 von PORTD geblieben. Fusebits berechnet mit Engbedded Atmel AVR® Fuse Calculator auf Low = 0xFF High = 0x99 (wurden gegenüber Atmega8 nicht verändert). Vielen Dank für die Hilfe :-)
> Problem: Am PC werden Zeichen dargestellt und das gesamte AVR_Terminal > vollgeschrieben. Unleserliche Zeichen sind ein deutliches Indiz, dass irgendwas mit der Baudrate nicht stimmt. Der häufigste Fall, warum diese nicht stimmt ist wiederrum, dass der µC nicht mir der Taktfrequenz arbeitet, die du im Programm für die Berechnung der Werte im Baudratenregister benutzt hast. Daher die Frage: Hast du wirklich einen 3.68 Mhz Quarz am µC und wird der auch benutzt? (Könnte man zb. mit einem Blinkprogramm abklären)
das Programm lief auf dem Atmega8, nicht aber auf dem Atmega16 ? Code /* EasyADC - 8-Bit Free Running Mode A/D Konverter Beispiel www.avrbuch.de ============================================================== Sie können diesen Quellcode zur freien Verwendung weitergeben. Erstellt: 2007, Roman Mittermayr (roman@avrbuch.de) ============================================================== WICHTIG: (1) Vor dem Compilieren, Optimization auf -Os stellen! (2) PORTC.0 mit einem Potentiometer verbinden (oder einer variablen Spannungsquelle von 0 bis 5V). PORTC.0 ist der Analoge Messkanal 0 und wird in diesem Beispiel fortlaufend ausgewertet (0V = 0, 5V = 255) (3) Achten Sie darauf, dass der Prozessortakt richtig eingestellt ist (siehe #define gleich unterhalb) (4) Die BAUDRATE beträgt 9600 Baud (8n1) und ist in der Datei rs232.h definiert. */ #define PROZESSORTAKT 3680000 #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #include "rs232.h" /* ==== INTERRUPT HANDLER: ADC Conversion Complete === */ SIGNAL (ADC_vect) { unsigned char c; char temp[5]; // ADC Resultat einlesen ======================= c = ADCH; /* Nur ADCH lesen, weil 8-Bit Modus */ // ADC Resultat auf RS232 ausgeben ============= itoa(c, temp, 10); /* In einen String konvertieren ... */ uart_putchar('\r'); uart_putstring("Messwert: "); uart_putstring(temp); uart_putstring(" "); } int main(void) { /* RS232 einschalten ...*/ setup_uart(); uart_putline("[ EasyADC -- www.avrbuch.de ]"); // Alle Interrupts erlauben sei(); // ADC, 8-Bit im Free Running Mode mit Interrupt // Referenzspannung: VCC // Takt: Systemtakt / 2 (4 MHz bei 8Mhz Quarz) ADMUX = (1<<REFS0) | (1<<ADLAR); ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADIE); // ADC starten! ADCSRA |= (1<<ADSC); // Endlosschleife while (1) ; return 0; }
Hi, oben steht: >#define PROZESSORTAKT 3680000 weiter unten kommt dann: >// ADC, 8-Bit im Free Running Mode mit Interrupt >// Referenzspannung: VCC >// Takt: Systemtakt / 2 (4 MHz bei 8Mhz Quarz) Also entweder oder??? Gruß
Du betreibst den ADC mit 1,84 MHz. Das ist weit außerhalb der Spezifikationen. Selbst eine Auflösung von 8 Bit ist damit illusorisch. Außerdem brauchen Deine Ausgabefunktionen im Interrupt Handler sicher deutlich länger als die Wandlung. Solche Funktionen haben in einem Interrupt Handler nichts zu suchen, auch wenn es in diesem Falle funktionell keinen Unterschied macht! Ein Interrupt Handler ist so kurz wie möglich zu halten. Der ganze Ausgabe-Rotz kann im Hauptprogramm abgearbeitet werden. Dadurch, dass die Ausgabe wesentlich länger dauert als die Wandlung gehen sowieso Wandlungsergebnisse zuhauf verloren. Du solltest erstens den ADC langsamer Takten und zweitens vielleicht mal eine Mittelwertbildung über 8 oder 16 Messwerte machen. Deine Ausgabe läuft derzeit mit maximaler Geschwindigkeit, d.h. der µC ist permanent am Senden. Da wundert es wenig, dass alles vollgeschrieben wird. Abgesehen davon ist SIGNAL veraltet. Nimm ISR stattdessen.
Schöne Dank erstmal, der Code stammt aus "AVR_RISC" Buch von Roman Mittermayr 2008, anscheinend ist das wohl keine sichere Bank.
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.