Guten Tag,
ich habe folgendes Problem. Ich habe ein Evaluationsboard von Pollin,
hat mir immer gute Dienste erwiesen. Hat bis dato alles irgendwann
funktioniert. Nur nun komme ich bei was ganz "simplen" nicht weiter: Ich
habe einen Atmgea16, laut Pollin Beschreibung liegen dem Set 3mal 8Mhz
Quarze bei. Stelle ich nun den Atmega16 auf 8Mhz und Baudrate 9600
Empfange ich über ein Nullmodelkabel zu einer ShineNet IO Karte
(seriell) bei einem kleinen Testprogramm nichts vernünftiges. Stelle
ich nun den Quarz auf 16 Mhz
funkioniert die Verbindung. Ich schließe daraus das es wohl ein 16Mhz
Quarz ist`? Übersehe ich was?
2. Mein kleines Testprogram wartet in einer Schleife auf die Eingabe
eines Bytes von der Rs232 Schnittstelle. Ich habe es in 4 Tagen nicht
geschafft ein Byte zu empfangen :(
Ich habe folgendes probiert: Zuerst benutzte ich noch einen
USB-to-Seriell
Converter. Der funkioniert (wenn auch langsam) zum flashen der avrs über
ponyprog. Er funktioniert auch um Ausgaben vom Controller zu übertragen
(Anzeige mit putty, hyperterminal, bascom terminal emulator getestet).
Allerdings kann ich wie beschrieben keine Werte senden. Es kommt
zumindestens nichts an. Das Testprogramm macht nichts anderes als in
einer Schleife auf eine eingaben zu warten und im falle diese
Auszugeben.
Zuerst vermutete ich den USB-to-Seriell Convertet, also besorgte ich mir
eine PCI-Nachrüstkarte um wieder echte serielle ausgänge zu haben.
Ponyprog rennt jetzt :)
Allerdings immer noch keine Reaktion des COntrollers wenn ich über die
Rs232 Schnittstelle was sende.
Meine nächste Vermutung: Der PegelConvertet max232.
Also im Datenblatt nachgeschaut und siehe da, er ist ein dualreceiver -
ich habe alos noch jeweils einen ungenutzen ein und- ausgang. Also 2
Brücken gelötet und den anderen Eingang des Max232 angeschlossen sowie
den Ausgang. Leider gleiches Ergebnis ;(
Hat irgendjemand eine Idee Anregun Erfahrung mit solch einem Problem.
Ach ja ich habe schon einen anderen atmega getestet, richtig geraten,
leider gleiches Ergebnis.
Danke schonmal!
mfg Jonas
@LordZiu: Sorry für die blöde Ausdrucksweise, ich meinte ich setzte im
Quellcode die Variable $crystal auf den Wert 16000000
Fusebits lese ich schnell aus...
Da steht auf 2 von 3: A83NDK69
Und auf dem anderen: 8c000000
Wenn ich Daten vom Controller in putty empfangen kann, sollte doch die
Baudrate bzw der Wert von $crystal stimmen? oder?
Jonas Biensack schrieb:
> Da steht auf 2 von 3: A83NDK69> Und auf dem anderen: 8c000000> Wenn ich Daten vom Controller in putty empfangen kann, sollte doch die> Baudrate bzw der Wert von $crystal stimmen? oder?
Sollte eigentlich. Was du auch noch zum Testen machen kannst, ist eine
LED in einem genügend langsamen Takt an- und auszuschalten. Z.B. alle 5
oder 10 Sekunden. Das kann man ganz gut mit ner Uhr nachmessen, ob das
Delay stimmt.
Also zusammenfassung: Externes Quarz ist über fusebit eingeschaltet.
Im Quellcode ist die baudrate auf 9600($baud = 9600) und das quarz auf
16mhz eingestellt ($crystal = 16000000).
Ich empfange wie erwartet daten in putty. Das funktioniert!
Mein Problem liegt beim Emfpang von Daten im MicroController.
Jonas Biensack schrieb:
> anderst gefragt: gibt es eine fusebit einstellung die ein senden von> daten ermöglichen aber einen empfang unmöglich machen würde?
Nein.
Wenn das Senden mit der eingestellten Baudrate funktioniert, dann auch
das Empfangen. Einzige Möglichkeit wäre noch: Du bist ein ganz kleines
bischen neben der eingestellten Frequenz. Das kann zb auftreten bei
internem RC-Oszillator. Der schwingt normalerweise auf zb 8 Mhz, hat die
aber nicht ganz genau. Ist nun die UART im PC etwas toleranter auf die
Abweichung dann kann sie zwar noch empfangen, aber das was vomPC
gesendet wird, liegt ein winziges bischen daneben. Empfangen müsstest du
trotzdem etws, nur nicht das richtige.
Da du aber 16Mhz im BASCOM angegeben hast und offenbar mit dieser
Einstellung und 9600 Baud auf dem PC auch mit 9600 Baud empfangen
kannst, kann man davon ausgehen, dass der Quarz auch benutzt wird. Einen
TC-Oszillator mit dieser Frequenz gibt es nicht. Das nächste wäre 8Mhz
und dann würde mit identischen Baudrateneinstellungen auf µC und PC
nichts mehr gehen.
Habe gerade folgendes nochmal gelesen:
"Für einen externen Quarz ist die Einstellung External Crystal/Ceramic
Resonator notwendig, also eine Einstellung von 1111. Unglücklicherweise
ist bei den vielen Fusebit Einstellprogrammen nicht auf den ersten Blick
offensichtlich, ob ein gesetztes Häkchen nun eine 1 oder eine 0
bedeutet. Anstatt auf 1111 werden die Fusebits auf 0000 gesetzt und
damit ein External Clock eingestellt. Ein External Clock ist aber ein
Quarzoszillator. Ein Quarz wird an so einer Einstellung nicht ins
Schwingen kommen"
das würde bedeuten meine fusebit setzen den avr auf externes quarz oder
nicht?
Jonas Biensack schrieb:
> das würde bedeuten meine fusebit setzen den avr auf externes quarz oder> nicht?
Stell fest, wie schnell dein µC wirklich getaktet wird.
Mach eine Schleife in der eine LED ein/aus geschaltet wird. Dazwischen
immer ein Wait (also Wartschleifen). Da die Warteschleifen auf die
Taktfrequenz abgestimmt werden müssen, sieht man da, ob das stimmen
kann. Ob deine Taktfrequenz ein paar Khz daneben liegt oder nicht, wirst
du so nicht feststellen können. Aber das ist ja auch nicht das Thema.
Hast du einen Wait 1 drinnen und die Wartezeit ist 1 Sekunde, dann
stimmt die $crystal Einstellung mit 16Mhz. Ist die reale Wartezeit 2
Sekunden, dann arbeitet der µC mit 8Mhz.
Den Unterschied 1 Sekunde zu 2 Sekunden sieht man aber mit freiem Auge.
Eine Uhr hatte ich bereits implementiert und die Abweichung bei einer
Stunde war mit bloßen Auge / Uhrenvergleich nicht zu messen (weniger als
1 sek). Das passt schon.
Jonas Biensack schrieb:
> Frage zu der Schaltung. Sollte ich auch den zweiten Eingang dann> beschalten?> Also immer Eingang 1 und Ausgang 1> oder geht auch Eingang1 und Ausgang 2
Ist völlig wurscht.
Ich denke nicht, dass der MAX spinnt.
Schnapp dir eine LED, häng einen Vorwiderstand 1k drann. Ein Ende dieser
Testschaltung an Masse (kurz mit dem anderen Ende an +5V titschen um zu
sehen ob die LED auch wirklich leuchtet). Dann legst du einen Stein auf
die PC-Tastatur (so dass der auf Dauersenden ist) und gehst mit deiner
LED die Schaltung, beginnend beim Kabel, durch. Das Blinken der LED ist
nicht zu übersehen. Hast du einen Punkt kontrolliert, gehst du eine
Stufe weiter, bis du weißt, wo das Signal verschwindet.
Danke schonmal! Ich sollte vielleicht noch was zu dem Projekt allgemein
sagen. Geplannt ist eine Klimasteuerung für ein Terrarium. Ich habe hier
SHT75 Feuchte - Temperatursensor erfolgreich angeschlossen. Mehrere
Relaistreiber, Lüftersteuerung usw sind gerade im Aufbau.
Ein Programm (vb net 2008) kommuniziert über Rs232 mit der Steuerung.
Bis Dato sendet der Controller einmal pro Sekunde die aktuelle Zeit,
Datum, sowie Feuchte - Temperaturwerte und aktuelle relaiszustände.
Die Software auf dem Rechner zeigt mir dann über ein Chart Controll die
Messwerte als Kurve an. Der Pc dient also als Schnittstelle Mensch -
Controller.
Soweit sogut. Nun habe ich mir "Protokol" ausgedacht nach den PC /
Controller kommunizieren. Eigentlich ziemlich simpel. Wäre da nicht das
Problem das "nichts aber auch garnichts" vom MircoController empfangen
wird. Daraufhin habe ich dann das Program auf 7 Zeilen! gekürzt um das
Problem einzugrenzen. Wie oben beschrieben.
Ich werde das mal probieren mit der LEd. Danke!
Meld mich gleich nochaml
So also: Direkt am Max232 blinkt sie schön, wenn ich sende. Hab ein
kleines Tool gemacht, was alle 2 Sekunden "A1" sendet und beeped. So hab
ich auch ein akustisches Signal und muss nicht auf den Pc schauen. Nach
dem Max leuchtet sie ständig( invertiert ?!). Ich meine ein ganz kurzes
abschächen der leuchtkraft wenn daten gesendet werden zu sehen. Mh....
Jonas Biensack schrieb:
> So also: Direkt am Max232 blinkt sie schön, wenn ich sende. Hab ein> kleines Tool gemacht, was alle 2 Sekunden "A1" sendet und beeped. So hab> ich auch ein akustisches Signal und muss nicht auf den Pc schauen. Nach> dem Max leuchtet sie ständig( invertiert ?!). Ich meine ein ganz kurzes> abschächen der leuchtkraft wenn daten gesendet werden zu sehen. Mh....
Geh mit der Baudrate runter. 300 Baud sieht man gut
Ok danke für den Tip. Ich glaube nämlich die Led ist doch dauern an :(
Würde auf einen defekten max232 hinweisen...
Ich progge mal schnell auf baudrate 300...
Also Baudrate ist nun auf 300 eingestellt. Hast recht jetzt sieht man es
schön. Allerdings nur vor dem Max232. Danach ist die LEd ständig an?
Max232 tot? Was meint ihr?
Was heißt denn "vor dem Max232"? Hab ich es richtig verstanden, dass
dein Controller Zeichen sendet und diese zwischen Controller und MAX232
mit der LED sichtbar sind und zwischen MAX232 und PC nicht mehr?
Was ist wenn der PC Daten sendet?
PC---1--Max232----2---MC RXD Empfangen (funktioniert nicht)
PC------Max232--------MC TD Senden (funktioniert)
Bei 1: Led blinkt wenn Pc Daten sendet
Bei 2: Led ist ständig an
Hoffe so ist ersichtlich, danke für euer Mühe!
mfg Jonas
Der Max232 hat ja zwei Sender / Empfänger. Ich habe nun den zweiten
Empänger beschaltet und nun geht die Led kurz aus, wenn Daten gesendet
werden.
Das ist doch schonmal gut, allerdings sobald ich den avr dann dann an
den max232 hänge, leuchtet die led wieder ständig. sie geht also bei
datenempfang nicht kurz aus. Ist das normal? Sollte die Led auch
ausgehen, wenn der avr drannhängt:
PC-------max232------1-----avr
PC-------max232------2-----
1: Hier leuchtet die LED ständig
2: Hier geht sie bei Datenempfang vom PC aus.
Wie könnte ich weiter vorgehen?
mfg jonas
Du kannst auch mal die Funktion der Ladungspumpen prüfen. Im Idealfall
solltest Du an Pin 2 +10V und an Pin 6 -10V messen. Sollte das eklatant
abweichen, so kontrollierst Du am besten die Beschaltung mit den
Kondensatoren nochmal. Allerdings glaube ich nicht, dass es daran liegt
denn das Senden von Controller zu PC funktioniert ja.
Außer eine unerwünschte Verbindung, die die RxD-Leitung zwischen
Controller und MAX232 auf Vcc oder einem ähnlichen Potential hält fällt
mir spontan auch nichts ein. Schaffst Du es dem MAX232 so in die fassung
zu stecken, dass Pin 10 bzw. 13 nicht mit drin stecken? Dann könntest Du
dort nochmal die LED dran halten.
Jonas Biensack schrieb:
> Das ist doch schonmal gut, allerdings sobald ich den avr dann dann an> den max232 hänge, leuchtet die led wieder ständig. sie geht also bei> datenempfang nicht kurz aus. Ist das normal?
Nein, ist es nicht.
Der entsprechende Eingang vom AVR ist auf Eingang gestellt. Wenn der MAX
auf low ziehen will, dann soll er das auch können.
Du bist am richtigen Pin?
Wenn das stimmt, kanns nur noch ein Softwareproblem sein oder aber der
max hat es wirklich hinter sich gebracht.
Jonas Biensack schrieb:
> Das ist doch schonmal gut, allerdings sobald ich den avr dann dann an> den max232 hänge, leuchtet die led wieder ständig. sie geht also bei> datenempfang nicht kurz aus. Ist das normal?
Du hattest schon den gleichen Einfall :-) Super!
Normal ist das nicht. Vielleicht hast Du den Pin am AVR versehentlich
als Ausgang konfiguriert.
Zusammenfassung:
An dem zweiten Empfänger für Rs232 Pegel (Pin8 am max232) blinkt die Led
auf wenn Daten gesendet werden. -gut-
An dem zweiten Ausgang für TTL Pegel (Pin9 am max232) geht die Led kurz
aus wenn Daten gesendet werden und der Avr nicht angeschlossen ist.
Ist der Avr aber angeschlossen, bleibt die Led ständig an, auch wenn
Daten gesendet werden.
danke für eure mühe.
So der minimale testcode:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 300
Dim Akey As Byte 'Here we
declare a byte variable
Do
Print
Print "Hello, hit any alphanumerical key..."
Akey = Waitkey() 'Waitkey
waits untill a char is received from the UART
Print Akey
Loop
> @Chris: Pin2: 8,91 Volt. Pin6: -8.31 Volt.
Passt.
Du kannst mal noch versuchen einen 1k Pullup gegen Vcc an Pin 9 des MAX
232 anzuschließen (ohne AVR in der Schaltung). Wenn die LED dann immer
noch blinkt halte ich den MAX232 für ok und der Fehler ist beim AVR zu
suchen.
Interresant ist, wenn ich das Kabel vom avr an den Max232 klemme, das
die led heller leuchtet?
1. Led leuchtet:
masse
|
Led
|
PC--------(pin 8)Max232(pin 9)----------------
2. Led leuchtet heller:
masse
|
Led
|
PC--------(pin 8)Max232(pin
9)----------------------------------(pin14)avr
Auf was könnte das hinweisen?
Also Led geht immer noch kurz aus wenn ich Daten sende mit pullup von
pin9 nach masse(1k). Hab einen anderen avr ausprobiert. Kommt nichts.
Das kann doch irdendwie alles nicht war sein. verzweifel mh....
Sobald ich einen avr an den Max232 leuchtet die Led ständig. Mache ich
ihn ab, geht sie aus bei Datenempfang. 3 avr durchprobiert. Ich mach
doch irgendwas grundsätzlich falsch ;(
mfg jonas
Hm, wahrscheinlich liegt es an der Software. Ich habe von BASCOM
überhaupt keinen Schimmer., daher kann ich dir hier nicht mehr
weiterhelfen. Trotzdem viel Erfolg noch!
P.S. Das einzige was mir noch einfällt: Was misst Du denn am AVR Pin 14
für eine Spannung wenn der Pin in der Luft hängt? 5V? Wenn ja, was misst
Du wenn Du mit einem 1k Pulldown an GND gehst? Sollten das immer noch 5V
sein, so ist der Pin irgendwie noch als Ausgang konfiguriert. Ist nur
noch so eine Idee...
Danke für die viele mühe!. Hat jemand zufällig ein kleines fertig
compiliertes Programm, was einfach nur ein Zeichen über uart empfängt
und das wieder zurückgibt. Ein echo quasi.
mfg jonas
Mir ist vielleicht noch was wesentliches eingefallen. Ich habe als ich
das pollin board bestellt hatte vergessen ein NEtzteil mitzubestellen.
War soweit kein Problem da ich noch ein 5 Volt netzteil hier rumliegen
hatte. Das pollin board braucht ja ein 9 Volt Netzteil mit
Wechselspannung. Das was ich hier rumliegn hatte, hat allerdings 5 Volt
Gleichspannung. Ich habe das netzteil an folgenden Punkten(s. Anhang) an
die Schaltung angeschlossen. Bis dato hatte ich keine Probleme, aber
vielleicht hat das ganze ja was mit dem Problem hier zu tun!
mfg Jonas
> Jeweils frei in der Luft und mit pullup nach masse(1k)> liegen knapp 5 volt an. Was heisst das nun genau?
Das der Pin nicht als Eingang konfiguriert sein kann. -> Das Problem ist
also wohl in deiner Software zu suchen.
> Ich habe das netzteil an folgenden Punkten(s. Anhang) an> die Schaltung angeschlossen.
Ist es stabilisiert (ggf. nachmessen)? Alles über 5,5V kann Schaden am
AVR verursachen. Unterspannung kann die Funktion natürlich auch
beeinträchtigen :-) Ansonsten kein Problem.
Sind saubere 5 Volt. Ich werd mir jetzt mal avrstudio laden. ein
beispiel programm aus dem netz suchen und versuchen das zu compilieren.
Danke für deine Hilfe.
Ich meld mich nochmal.
mfg jonas
Mein Tip: Lerne Assembler und arbeite das AVR-Tutorial hier durch. Das
dauert zwar, aber nur so wirst Du deinen Controller so richtig kennen
und verstehen lernen.
Guter Tip, ich habe schon ne ganze Weile in assembler geproggt. War
alles toll, bis irgendwelche Side-Effecte aufgetretten sind die ich
nicht debuggen konnte. Das war grausam. Ich hab dann einfach mal aus
Spass Bascom probiert und das hat sofort super gefunzt. Entwicklungszeit
hat sich wesentlich verkürzt. Vor allem funktionierte meistens alles wie
erwartet. Und Bascom compiliert es ja auch in asm und meistens
optimiert. Nun ja, wird mir wohl nichts anderes übrig bleiben als es
wieder anzugehen. Sobald ich den Fehler habe, werde wieder auf bascom
umschweifen.
Mfg Jonas
So, habe nun ein Software-Uart mit bascom eingerichtet:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 300
Dim Tstr As String * 4
Dim Num As Word
'open channel for output
Open "comb.2:300,8,n,1" For Input As #2
Do
Waitms 100
Print "text: "
Input #2 , Tstr
Print Tstr
Print "number: "
Input #2 , Num
Print Num
Loop
End
Und siehe da es funktioniert. Keine Ahnung warum der Hardware-Uart nicht
wollte. Auf jeden Fall bin ich nun sehr froh das es nun endlich weiter
gehen kann. Ich danke allen die sich die Mühe gemacht haben mir zu
helfen.
Also danke!
mfg Jonas