Hallo.
Ich habe einen Atmega8 und ein STK500 und versuche damit gerade
ADC-Werte über UART an den PC zu senden...
Den Quellcode zum Senden habe ich vom Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
Das komische ist, dass es eine kurze Zeit funktioniert.
Jedesmal wenn ich auf den RESET-Button am STK-500 drücke kommen ein paar
Zahlenwerte vom ADC (die auch richtig sind).
Aber nach ca. 1s hört er auf.
Mir ist auch aufgefallen, dass wenn der ADC-Wert 3-stellig ist, ich 16
Zahlen bekomme und wenn der Wert nur 2-stellig ist, ich sogar 20 Werte
erhalte. Manchmal steht nach der letzten Zahl auch ein Sonderzeichen.
Manchmal siehts aus wie ein t, manchmal ein ü oder '...
Hier der Quellcode:
main.c:
1
#include<avr/io.h>
2
#include<stdlib.h> // itoa
3
#include"myUART.h"
4
#include"myADC.h"
5
#include<util/delay.h>
6
7
// MAIN
8
intmain(void){
9
10
// LEDs initialisieren
11
DDRB=0xFF;
12
PORTB=0x00;
13
14
// UART initialisieren
15
uart_init();
16
17
// ADC initialisieren
18
ADC_Init();
19
20
// Variablen definieren
21
uint16_tadcval;
22
chars[7];
23
24
while(1){
25
26
// ADC auslesen
27
adcval=ADC_Read(0);
28
29
//uart_puts("\n\r");
30
//uart_puts("Hello world\n\r");
31
32
// UART senden
33
itoa(adcval,s,10);// 10 steht fuer radix (Dezimalsystem)
34
uart_puts(s);
35
36
// Da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
37
//uart_puts(itoa(adcval,s,10));
38
39
// UART senden
40
uart_puts("\n\r");// Zeilenumbruch
41
42
//_delay_ms(1000);
43
}
44
return0;
45
}//*/// END of main
myUART.h:
1
#include<avr/io.h>
2
3
voiduart_init(void);
4
intuart_putc(unsignedcharc);
5
voiduart_puts(char*s);
myUART.c:
1
#include"myUART.h"
2
3
/*
4
UART-Init:
5
Berechnung des Wertes für das Baudratenregister
6
aus Taktrate und gewünschter Baudrate
7
*/
8
9
#ifndef F_CPU
10
11
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 2000000"
12
#define F_CPU 2000000UL // Systemtakt in Hz - Definition als unsigned long beachten
13
// Ohne ergeben sich unten Fehler in der Berechnung
Ich glaub auch nicht wirklich, dass da was falsch ist, denn die werte
werden immer richtig ausgegeben. Wenn ich die Baudrate am terminal
umstelle kommt natürlich Mist raus, aber in allen Fällen bricht er das
senden nach kurzer Zeit ab. Auch am Oszi hab ich kurz rumprobiert. Wenn
ich reset drücke, sehe ich kurz ein paar Flanken, aber danach ist wieder
alles ruhig.
Ich glaub halt es liegt am Code, dass der µC nach kurzer Zeit zum Senden
aufhört.
Wenn du kein DebugWire hast, hast du vielleicht noch ein paar LED am µC?
Die würde ich mal benutzen:
2 LED
Vor dem ADC auslesen die 1. LED ein
ADC auslesen
die 1. LED wieder ausschalten
vor der Ausgabe die 2.te LED ein
ausgeben
danach die 2.te LED wieder aus
Fragestellungen:
Wenn der UART Datenstrom aufhört, hört dann auch das Geblinke der LED
auf?
Wenn ja: Welche LED ist als letztes eingeschaltet?
Weil (zumindest bei meinem STK) beim Drücken des reset Knopfes der µC
sich "zu verschlucken" scheint. Mehrmaliges Drücken hilft manchmal aber
"am saubersten" ist der Power Schalter.
Attila Ciftci schrieb:> Weil (zumindest bei meinem STK) beim Drücken des reset Knopfes der µC> sich "zu verschlucken" scheint.
Sehr seltsam. Der Knopf wird über die Firmware des STK-Controllers
gepollt und dann als /RESET über einen Levelshifter (diskret
aufgebaut wie alle beim STK500) weitergereicht.
Hast du mal einen Oszi da dran gehalten? Bei mir prellt da nichts.
Ich wollte nur dem Chris einen Hinweis geben das es vielleicht Teil
seines Problems ist. Ich habe ein LCD am Atmega8 dran und beim drücken
des reset am STK kommen da auch gerne irgendwelche Sonderzeichen. Ein
"richtiges" power off lässt den Atmega wieder machen was er soll.
Attila Ciftci schrieb:> Ich wollte nur dem Chris einen Hinweis geben das es vielleicht Teil> seines Problems ist.
Ich würde es für einen Fehler in deinem STK halten.
Mir ist nicht aufgefallen, dass sich das STK500 anders verhält, wenn ich
es aus- und wieder einschalte (anstelle des Reset-Buttons).
Karl Heinz Buchegger schrieb:> Wenn du kein DebugWire hast, hast du vielleicht noch ein paar LED am µC?>> Die würde ich mal benutzen:> 2 LED>> Vor dem ADC auslesen die 1. LED ein> ADC auslesen> die 1. LED wieder ausschalten>> vor der Ausgabe die 2.te LED ein> ausgeben> danach die 2.te LED wieder aus>>> Fragestellungen:> Wenn der UART Datenstrom aufhört, hört dann auch das Geblinke der LED> auf?> Wenn ja: Welche LED ist als letztes eingeschaltet?
Ich kann dir versichern, dass es daran nicht liegt. Egal ob ich jetzt
ein "hello world" oder nur einen einzelnen char wiederholt ausgebe, es
hört nach kurzer Zeit auf.
Allerdings hab ichs jetzt mal eine LED am PD1(TXD) angeschlossen und
siehe da: Sie leuchtet und leuchtet und leuchtet. Muss wohl doch an der
Baudrate liegen. Allerdings bin ich davon ausgegangen, dass wenn die
Baudrate nicht stimmt, trotzdem irgendetwas empfangen wird.
Vielleicht liegts an den Einstellungen am STK500 und im AVR Studio !?
Der XTAL1-Jumper ist gesetzt.
>Datenblatt:>> When the XTAL1 jumper is connected, the STK500 internal clock system>> is used as main clock to the target AVR.
OSCSEL-Jumper Pin 1 und 2 sind verbunden.
>Datenblatt:>> On-board software clock signal connected (default)
In den Project configuration options im AVR studio sind 2MHz
eingestellt.
Wenn das STK500 verbunden ist, sind folgende Einstellungen zu sehen:
Fuses:
SUT_CKSEL (Clock Source) ist auf "Int. RC Osc. 2MHz; Start-up time: 6 CK
+ 64ms" eingestellt.
Advanced:
Oscillator Calibration Byte: "Select Frequency"
(es würden noch 1,2,4 und 8MHz zur Auswahl stehen)
HW Settings:
Clock Generator: 3.686 MHz
Ich habe auch schon mal die Frequenz von 2Mhz auf 3.686MHz umgestellt,
da sich der Clock Generator nicht genau auf 2Mhz einstellen lässt, aber
da kamen am Terminal nur irgendwelche Sonderzeichen raus, also nehme ich
mal an das der Clock Generator nicht aktiv ist...? Stimmt das ?
Es ist halt etwas verwirrend für mich, da man an so vielen Stellen die
Frequenz einstellen muss.
Beim STK500 ist auch noch ein "Crystal"-Anschluss, der bei mir frei ist.
Ich hätte noch einen 2MHz und einen 4MHz Quarz rumliegen. Ich habe auch
schon einen drauf gehabt und versucht, über diesen den µC zu takten,
aber da kam am Terminal nie was brauchbares an. Vielleicht sind auch nur
die Jumper am STK500 falsch gesetzt oder die Clock Source im AVR Studio
falsch eingestellt ? Ich hab schon einige Varianten ausprobiert, aber
ich weiß nicht, welche die Richtige ist...
Chris schrieb:> Wenn das STK500 verbunden ist, sind folgende Einstellungen zu sehen:> Fuses:> SUT_CKSEL (Clock Source) ist auf "Int. RC Osc. 2MHz; Start-up time: 6 CK> + 64ms" eingestellt.
Vermutlich willst du eher nicht mit dem internen RC-Oszillator
arbeiten, wenn du eine exakte Frequenz haben möchtest.
Der Generator auf dem STK500 ist aus Sicht des AVRs übrigens ein
"external clock", wenngleich die meisten Einstellungen für einen
externen Quarz genauso funktionieren werden.
Chris schrieb:> Ich kann dir versichern, dass es daran nicht liegt.
Woran liegt es nicht? Karl Heinz hat doch gar keine mögliche Ursache
angegeben, sondern Dir nur einen Weg beschrieben, den Fehler
einzugrenzen.
> Ich kann dir versichern, dass es daran nicht liegt.> Egal ob ich jetzt ein "hello world" oder nur einen einzelnen char> wiederholt ausgebe, es hört nach kurzer Zeit auf.
Ja und?
Irgendwas friert ein. Und da keiner weiß was, muss man sich erst mal
einen Überblick verschaffen, was denn eigentlich einfriert.
> Allerdings hab ichs jetzt mal eine LED am PD1(TXD) angeschlossen> und siehe da: Sie leuchtet und leuchtet und leuchtet.
Siehst du. Die soll nämlich gar nicht leuchten. Die sollte eigentlich
flackern, weil da ja eine Übertragung rauskommen sollte. Dein Test hat
jetzt eigentlich nur gezeigt: Dein µC friert ein. Gut, damit ist der PC
erst mal aus dem Schneider, an dem liegt es nicht. Das ist jetzt aber
keine wirklich weltbewegende Erkentnis und war zu erwarten.
Karl Heinz Buchegger schrieb:> Die sollte eigentlich> flackern, weil da ja eine Übertragung rauskommen sollte.
Meinst du, das würde man optisch von Dauerleuchten unterscheiden
können? Ich würde mal ein Oszillonuckel da dran klemmen.
Jörg Wunsch schrieb:> Meinst du, das würde man optisch von Dauerleuchten unterscheiden> können?
Spätestens, wenn das auskommentierte _delay_ms(1000) wieder eingefügt
wird.
PS:
Wobei es dann wahrscheinlich ohne weitere Änderungen am Code aussähe,
als würde die LED gar nicht leuchten.
Jörg Wunsch schrieb:> Karl Heinz Buchegger schrieb:>> Die sollte eigentlich>> flackern, weil da ja eine Übertragung rauskommen sollte.>> Meinst du, das würde man optisch von Dauerleuchten unterscheiden> können?
9600 Baud?
Ja, das flackert noch wunderbar. Mit noch geringerer Baudrate sieht man
es noch viel besser, aber 9600 ist noch gut erkennbar.
ALs ich noch kleiner Programmierknecht auf einer VAX war, hatte der
Admin immer so einen Zwischenstecker mit ein paar LED dabei.
J.-u. G. schrieb:> Jörg Wunsch schrieb:>> Meinst du, das würde man optisch von Dauerleuchten unterscheiden>> können?>> Spätestens, wenn das auskommentierte _delay_ms(1000) wieder eingefügt> wird.
Dann erst recht nicht. TxD = high ist ja der Ruhezustand, und
das würde dann nur von ein paar Impulsen unterbrochen.
Wenn man die LED mal zwischen Ausgang und Masse und mal zwischen
Ausgang und Vcc anklemmt, und sie leuchtet in beiden Positionen,
dann werden Daten übertragen. ;-)