Forum: Mikrocontroller und Digitale Elektronik kann ich testen, ob meine Schaltung tut


von Pfeiffy (Gast)


Lesenswert?

Hallo,
ich habe eine Schaltu8ng gebaut, die nur einen Buchstaben senden soll. 
Das programm ist, denke ich auch schon gelaufen. Nun habe ich eine neue 
Schaltung mit neuem Atmege 8 8mhz gebaut und da programm aufgespielt - 
aber im hyperterminal kommt nichts an. habe so berechnet (im Programm):
=> Schaltung ist gekauft, sollte also funktionieren.
1
.equ F_CPU = 4000000                            ; Systemtakt in Hz
2
.equ BAUD  = 9600                               ; Baudrate
3
 
4
; Berechnungen
5
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
6
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
7
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille

Gruss Pfeiffy

von MaWin (Gast)


Lesenswert?

Deinem Programm fehlt jeglicher Code der das Zeichen sendet.

von Karl H. (kbuchegg)


Lesenswert?

Pfeiffy schrieb:

> aber im hyperterminal kommt nichts an. habe so berechnet (im Programm):
> => Schaltung ist gekauft, sollte also funktionieren.

Dann teste mal, ob die Belegung der RS232 Buchse/Stecker zu deinem Kabel 
passt.

Wenn das nicht richtig gekreuzt/nicht gekreuzt ist, dann sendet der AVR 
auf der Leitung, auf der auch der PC sendet. Und dann geht natürlich 
nichts.

von Pfeiffy (Gast)


Lesenswert?

ja klar, habe nur die baud-berechnung reinkopiert, hier das programm:
1
.include "m8def.inc"
2
 
3
.def temp    = r16                              ; Register für kleinere Arbeiten
4
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
5
                                                ; Ausgabefunktion übergeben
6
 
7
.equ F_CPU = 4000000                            ; Systemtakt in Hz
8
.equ BAUD  = 9600                               ; Baudrate
9
 
10
; Berechnungen
11
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
12
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
13
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
14
 
15
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
16
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
17
.endif
18
 
19
    ; Stackpointer initialisieren
20
 
21
    ldi     temp, HIGH(RAMEND)
22
    out     SPH, temp
23
    ldi     temp, LOW(RAMEND)
24
    out     SPL, temp
25
 
26
    ; Baudrate einstellen
27
 
28
    ldi     temp, HIGH(UBRR_VAL)
29
    out     UBRRH, temp
30
    ldi     temp, LOW(UBRR_VAL)
31
    out     UBRRL, temp
32
 
33
    ; Frame-Format: 8 Bit
34
 
35
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
36
    out     UCSRC, temp
37
 
38
    sbi     UCSRB,TXEN                  ; TX aktivieren
39
 
40
loop:
41
    ldi     zeichen, 'M'
42
    rcall   serout                      ; Unterprogramm aufrufen
43
    ldi     zeichen, 'i'
44
    rcall   serout                      ; Unterprogramm aufrufen
45
    ldi     zeichen, 'l'
46
    rcall   serout                      ; ...
47
    ldi     zeichen, 'e'
48
    rcall   serout
49
    ldi     zeichen, 'n'
50
    rcall   serout
51
    ldi     zeichen, 'a'
52
    rcall   serout
53
    ldi     zeichen, 10
54
    rcall   serout
55
    ldi     zeichen, 13
56
    rcall   serout
57
    rcall   sync                        
58
    rjmp    loop
59
 
60
serout:
61
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
62
                                        ; Byte bereit ist
63
    rjmp    serout
64
    out     UDR, zeichen
65
    ret                                 ; zurück zum Hauptprogramm
66
 
67
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
68
; das Kabel getrennt wurde
69
                                    
70
sync:
71
    ldi     r16,0
72
sync_1:
73
    ldi     r17,0
74
sync_loop:
75
    dec     r17
76
    brne    sync_loop
77
    dec     r16
78
    brne    sync_1  
79
    ret

von Bitflüsterer (Gast)


Lesenswert?


von Pfeiffy (Gast)


Lesenswert?

den

Karl Heinz schrieb:
> Pfeiffy schrieb:
>
>> aber im hyperterminal kommt nichts an. habe so berechnet (im Programm):
>> => Schaltung ist gekauft, sollte also funktionieren.
>
> Dann teste mal, ob die Belegung der RS232 Buchse/Stecker zu deinem Kabel
> passt.
>
> Wenn das nicht richtig gekreuzt/nicht gekreuzt ist, dann sendet der AVR
> auf der Leitung, auf der auch der PC sendet. Und dann geht natürlich
> nichts.

ich denke, ich hab das schon alles getestet, bin aber so langsam ein 
bisschen verunsichert - kannst du mir sagen, an welchem Pin am 232 was 
kommen muss.

Gruß
Pfeiffy

von Karl H. (kbuchegg)


Lesenswert?

Zum testen ist eine normale LED mit einem 330 Ohm Vorwiderstand ein 
gutes Hilfsmittel. Bei 9600 Baud sieht man die LED wunderbar flackern, 
so dass du an unterschidelichen Messpunkten entlang des Kabels/Platine 
verfolgen kannst, bis wohin und auf welcher Leitung dein AVR klimpert.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Dieses Programm wiederholt ständig das Senden von 8 Zeichen,
ist also auch nicht das was du beschrieben hast.

von Amateur (Gast)


Lesenswert?

Zwei Sachen fallen mir auf:
1. 9600 Baud sind für 4 MHz relativ viel.
2. 4 MHz sind eine echte Seltenheit beim xx8.
   Intern sind 8 MHz bzw. 1 MHz üblich.

von Karl H. (kbuchegg)


Lesenswert?

Amateur schrieb:
> Zwei Sachen fallen mir auf:
> 1. 9600 Baud sind für 4 MHz relativ viel.

wie kommst du auf die Schnapsidee?
9600 sind doch überhaupt kein Problem.

> 2. 4 MHz sind eine echte Seltenheit beim xx8.
>    Intern sind 8 MHz bzw. 1 MHz üblich.

Mag sein.
Aber wenn Taktrate oder Baudrate nicht stimmen, dann tauchen am PC im 
Hyperterminal wenigstens irgendwelche Zeichen auf. Es sind zwar die 
falschen, aber es kommt irgendwas.
Kommt gar nichts, dann würde ich als erstes mal auf eine 
Fehlkonfiguration am AVR tippen (lässt sich mit einer LED am TxD Pin vom 
AVR prüfen), wenn da alles in Ordnung ist, dann könnte es mglw. der 
MAX232 sein (auch das lässt sich mit der LED sofort prüfen) und wenn da 
alles in Ordnung ist, dann wäre mein heißer Kandidat ein falsch 
gekreuztes Kabel.

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Pfeiffy schrieb:
> Hallo,
> ich habe eine Schaltu8ng gebaut, die nur einen Buchstaben senden soll.
> Das programm ist, denke ich auch schon gelaufen. Nun habe ich eine neue
> Schaltung mit neuem Atmege 8 8mhz gebaut und da programm aufgespielt -
> aber im hyperterminal kommt nichts an. habe so berechnet (im Programm):
> => Schaltung ist gekauft, sollte also funktionieren.

> .equ F_CPU = 4000000 ; Systemtakt in Hz

hust

von Pfeiffy (Gast)


Lesenswert?

also zwischen Masse und tx bekomme ich pulsierend zwischen 4,8 und 5,3V, 
am rs232 habe ich diese 4,8 bis 5,3 auf dem pin 3

Gruss Pfeiffy

von Karl H. (kbuchegg)


Lesenswert?

Pfeiffy schrieb:
> also zwischen Masse und tx bekomme ich pulsierend zwischen 4,8 und 5,3V,
> am rs232 habe ich diese 4,8 bis 5,3 auf dem pin 3

Im Ernst:
An dieser Stelle ist eine LED gegen Masse verschaltet, als 'Messgerät' 
so ziemlich jedem Voltmeter eindeutig überlegen.

Geh mit der LED auf den TxD Pin vom Mega.
Du musst dort EINDEUTIG ein Blinken/Flackern sehen können (klemm dazu 
den PC ab).
Dieses Blinken verfolgst du durch die ganze Schaltung, bis du beim RS232 
Stecker angelangt bist.
Danach weißt du zusätzlich, wie dein RS232 Anschluss auf der AVR Platine 
verschaltet ist (das ist leider nicht eindeutig geregelt. Es gibt zwar 
so etwas wie eine Norm, aber je nachdem, ob der Entwickler der Ansicht 
ist, dass es sich hier um eine DFU oder eine DFE handelt, hat er den 
Stecker/Buchse anders belegt.

Dann legst du einen Stein auf die PC-Tastatur, nimmst wieder deine LED 
zur Hand und siehst am AVR-seitigen Kabelende nach, auf welchem Pin es 
blinkt. Dieser Pin darf nicht derselbe sein, auf dem der AVR seine Daten 
rausbläst.

Die beiden müssen auf den gegenteiligen Adern blinken.
Entweder der PC auf 2 und der AVR auf 3. Oder eben anders rum: der PC 
auf 3 und der AVR auf 2.

Aber mach die Sache mit einer LED. Du wirst sehen, das geht schneller 
und zuverlässiger als mit einem Voltmeter. Unzählige Sysadmins haben in 
der Vergangenheit damit ihre Kabelprobleme in 20 Sekunden unter 
Kontrolle gebracht. Das funktioniert so gut, dass es früher sogar eigene 
Zwischenstecker gab, in denen nichts anderes als diese LED eingebaut 
waren.

Abgesehen davon: wieso ca. 5V?
Auf einer RS232, die zum PC geht, solltest du eher +-12V messen. OK, in 
der Praxis sind es eher +-10V, aber geschenkt.

: Bearbeitet durch User
von Pfeiffy (Gast)


Lesenswert?

ok, die led blinkt zwischen 2(-) und 5 (+)

von Pfeiffy (Gast)


Lesenswert?

am Stecker am PC

von Pfeiffy (Gast)


Lesenswert?

ich hab jetzt auch nochmal über burnomat die Fuses ausgelesen. Steht auf 
type: crystal, range 3-8mhz, slowly rising poweer, large output swing.

External RC oszilator steht auf 0.9-3
Calibrated intern oszilator steht auf 1mhz

ich weiss im Moment nichrt was ich machen soll.

Pfeiffy

von Bitflüsterer (Gast)


Lesenswert?

Die Burn-o-mat-Ausgabe sollte mal jemand kommentieren, der die SW kennt. 
Mir kommt sie widersprüchlich vor. Entweder ich nutze den internen 
RC-Oszillator mit 8MHz oder_ einen externen RC-Oszillator _oder einen 
externen Quarz.

Aber Du könntest in der Zwischenzeit mal den Pegel an den RS232 
Leitungen TX des uC kontrollieren. Sollte im Ruhezustand (ohne das etwas 
gesendet wird) etwa -10V bis -12V sein.

Auch könntest Du mal den Schaltplan Deiner neuen Platine posten. Nur zur 
Sicherheit.

von Karl H. (kbuchegg)


Lesenswert?

Bitflüsterer schrieb:
> Die Burn-o-mat-Ausgabe sollte mal jemand kommentieren, der die SW kennt.
> Mir kommt sie widersprüchlich vor.

Nicht nur dir.

Das kann doch nicht so schwer sein, mal auf die Platine zu schauen und 
dort nachzusehen ob da ein Quarz drauf verbaut ist und wenn ja, welche 
Zahlenangabe da drauf steht.


> Aber Du könntest in der Zwischenzeit mal den Pegel an den RS232
> Leitungen TX des uC kontrollieren. Sollte im Ruhezustand (ohne das etwas
> gesendet wird) etwa -10V bis -12V sein.

Der Verdacht ist mir auch schon gekommen, dass da ev. gar kein MAX232 
verbaut ist und es sich um eine sog. TTL-UART handelt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz, ich bewundere deine Geduld...

Karl Heinz schrieb:
> Das kann doch nicht so schwer sein
Es ist nicht schwer. Man muss nur einfach mal SELBER das Gehirn (das 
Ding zwischen den Ohren) verwenden und nicht gleich die Community 
fragen, wenn sich mal ein Fürzlein verklemmt. Der dann stattfindende 
Prozess nennt sich "Lernen".

: Bearbeitet durch Moderator
von Bitflüsterer (Gast)


Lesenswert?

Hm. Seit einer Stunde kein Beitrag mehr vom TO. Der ist nach Hause 
gegangen. :-)

von Hikle (Gast)


Lesenswert?

@ Pfeiffy

Poste doch ein Bild von deinem Aufbau.

von Pfeiffy (Gast)


Lesenswert?

also es ist ein elecont-Board (Carrierboard mit Atmega8 16au), mit 16mhz 
Quartz und einem max232. Ausgang am tx ist ca 10V.

Gruß
Pfeiffy

von Bitflüsterer (Gast)


Lesenswert?

Schön. Und was ist da nun für ein Quarz d'rauf?

>Ausgang am tx ist ca 10V.

Du meinst sicher -10V, oder?

von Pfeiffy (Gast)


Lesenswert?

Pfeiffy schrieb:
> also es ist ein elecont-Board (Carrierboard mit Atmega8 16au), mit
> 16mhz
> Quartz und einem max232. Ausgang am tx ist ca 10V.
>
> Gruß
> Pfeiffy

Bitflüsterer schrieb:
> Schön. Und was ist da nun für ein Quarz d'rauf?
>
>>Ausgang am tx ist ca 10V.
>
> Du meinst sicher -10V, oder?

16mhz (siehe oben)
Das problem beim Burnomat ist denke ich, dass ich verschiedene 
Einstellungen machen kann, aber nicht sehe, welche aktiv ist

von Bitflüsterer (Gast)


Lesenswert?

> 16mhz (siehe oben)

Schön. Ich weiss nur noch nicht ob Du das aus der Beschreibung abgelesen 
hast oder selbst nachgeschaut.

Was ist mit den 10V? Plus oder Minus?

>Das problem beim Burnomat ist denke ich, dass ich verschiedene
>Einstellungen machen kann, aber nicht sehe, welche aktiv ist
Poste doch mal einen Schnappschuss vom Bildschirm.

von Bitflüsterer (Gast)


Lesenswert?

Falls sich das mit den 16MHz (das M schreibt man übrigens groß, sonst 
heisst es Millihertz) bestätigt, dann muss Du die Zeile:
1
.equ F_CPU = 4000000

natürlich entsprechend anpassen.

von Bitflüsterer (Gast)


Lesenswert?

Was denn jetzt? Meine Güte. Da kriegt man ja Flöhe.

von Pfeiffy (Gast)


Lesenswert?

Bitflüsterer schrieb:
> Falls sich das mit den 16MHz (das M schreibt man übrigens groß, sonst
> heisst es Millihertz) bestätigt, dann muss Du die Zeile:
>
>
1
> .equ F_CPU = 4000000
2
>
>
> natürlich entsprechend anpassen.

ok, bin gerade etwas krank, daher langsam.....
nun beim brennen kommt :Yikes! Invalid device signatur... kann da ein 
Kabel raus ein?

Gruß
Pfeiffy

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Bitflüsterer schrieb:
>> 16mhz (siehe oben)
>
> Schön. Ich weiss nur noch nicht ob Du das aus der Beschreibung abgelesen
> hast oder selbst nachgeschaut.
>
> Was ist mit den 10V? Plus oder Minus?
>
>>Das problem beim Burnomat ist denke ich, dass ich verschiedene
>>Einstellungen machen kann, aber nicht sehe, welche aktiv ist
> Poste doch mal einen Schnappschuss vom Bildschirm.

von Mike (Gast)


Lesenswert?

Lern mal deutsch - Deine Betreffzeile schreit zum Himmel...

von Bitflüsterer (Gast)


Lesenswert?

Ich kenne nun den Burn-O-Mat überhaupt nicht. Daher sind meine Hinweise 
mit Vorsicht zu geniessen. Nachdem ich aber mal diese Seite hier 
http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_en.html 
gelesen habe, meine ich, zumindest eine Ahnung zu haben, was das Problem 
ist.

Ich sehe nämlich auch, dass es möglich ist, jeden der Tabs für die 
verschiedenen Oszillator-Optionen auszuwählen, obwohl natürlich nur 
einer davon relevant sein kann.

Ausgerechnet aber die Seite (siehe 
http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_screenshot_fuses.png) 
die darüber Auskunft geben könnte, welche der Unterseiten relevant ist, 
zeigst Du aber nicht. Dort sind nämlich die Fuses angegeben - so dass 
man mit dem Datenblatt erkennen kann, welche Taktquelle gewählt ist.

Und das war genau meine Vorgehensweise.

1. Suche nach "Burn-O-Mat". Erster Treffer: 
http://avr8-burn-o-mat.aaabbb.de/avr8_burn_o_mat_avrdude_gui_en.html
2. Ein wenig scrollen, was es überhaupt so gibt. (Auf der Suche nach 
"Anleitung", "Manual" oder sinnverwandte Worte. Aber Screenshoots 
gefunden.
3. Erster Screenshoot zeigt Button "Fuses". Aha!
4. Zweiter Screenshoot zeigt die tatsächlichen Werte der Fuses. Super.
5. Dazu noch das Datenblatt aufgemacht. Aha. Crystal-Osz. ist aktiviert.

etcpp.

Genauso machst Du es auch.

Zugegeben: Es ist ein wenig ungünstig, dass die anderen Tabs der 
Taktquellen, die nicht aktiviert sind auch auswählbar sind oder nicht 
besonders gekennzeichnet. Aber gut. Ein bisschen mitdenken muss man 
schon mal. Ist nicht alles perfekt in der Welt der Programmierer. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Unabhängig davon.
Mach halt mal den in der Checkliste angegebenen Schnelltest, ob die 
Taktfrequenz hinkommt. mittels delay_ms eine LED 1 Sekunde ein, 1 
Sekunde aus.
Ob die Taktfrequenz 7.8Mhz oder 8.1Mhz ist, kann man damit nicht 
feststellen. Aber diese Optionen stellen sich ja nicht. Es gilt 1Mhz von 
8 Mhz bzw. von 16Mhz zu unterscheiden. Und das sieht man mit freiem Auge 
alle mal, ob eine LED 1 Sekunde oder 8 Sekunden (oder 16 Sekunden) 
leuchtet.

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

ok, bin ja lernfähig, trotz Krankheit:
das heißt nun (erstes Bild aus Burn-o-mat)
sut1:0
sut0:1
cksel3:1
cksel2:1
cksel1:1
cksel0:0

Das wäre dann der intere i MHZ Oszilator - korrekt!

Das zweite Bild zeigt due gleichen Fueses aus eine Ponyprog-Beschreibung 
(nur als Referenz)

==> ich takte also mit 1MHZ intern!

von Dirk (Gast)


Lesenswert?

ok, ich wollte die ganze Sache mal auflösen: ich hab die Schalung jetzt 
mal am PC meiner Tochter getestet - und da funktioniert es einwandfrei!
Also ist mein Com platt! hab mir nun einen USB-Com geholt und damit 
klappt es!! Nochmal vielen Dank an alle!!

Gruß
Pfeiffy

von Bitflüsterer (Gast)


Lesenswert?

Dirk schrieb:
> ok, ich wollte die ganze Sache mal auflösen: ich hab die Schalung jetzt
> mal am PC meiner Tochter getestet - und da funktioniert es einwandfrei!
> Also ist mein Com platt! hab mir nun einen USB-Com geholt und damit
> klappt es!! Nochmal vielen Dank an alle!!
>
> Gruß
> Pfeiffy

Dein Posting vom 8.7. hatte ich leider nicht gesehen.

Aus meiner Sicht wäre das Thema damit nicht erledigt.

Wenn nämlich Dein uC wirklich mit dem internen RC-Oszillator betrieben 
wird, dann ist es (im wesentlichen) Zufall, dass der uC gerade am PC 
Deiner Tochter und an dem USB-RS232-Converter funktioniert.

Der Punkt ist, dass der RC-Oszillator sehr temperaturabhängig ist. Ein 
anderer Punkt ist, dass es durchaus möglich ist, dass der PC Deiner 
Tochter bzw. der Converter ein wenig toleranter ist, als üblich. Möglich 
ist auch eine Kombination aus beiden Faktoren.

D.h. Du hast jetzt eine besondere Situation in der es geht. Aber es 
sollte an sich an allen PCs gehen und in (fast) jeder Situation.

------------------------------------------------------------------------
Wenn Du das Board mit dem darauf enthaltenen Quarz betreibst, dann 
sollte es auch mit Deinem PC ohne Konverter funktionieren.
------------------------------------------------------------------------

Du musst nur, den Fuses umstellen so dass ein Quarz gewählt ist 
("External Crystal") und die Frequenz bei dem define einstellen.

Offen bleibt, auch wie der Pegel an Deiner Schnittstelle aussieht - wenn 
auch die Wahrscheinlichkeit, dass hier das Problem liegt, ein wenig 
gesunken ist.

Ich weiß, es ist in Deiner Situation wahnsinnig verführerisch, zu 
denken, man habe das Problem gefunden und gelöst. Wenn Du aber mal ganz 
genau darüber nachdenkst, dann hast Du nur festgestellt, dass zwei 
bestimmte Kombinationen funktionieren. Du hast aber nicht 
festgestellt, welcher Parameter in solcher Weise von den Nominalwerten 
abweicht, dass es in einer gewissen Kombination nicht geht.

Wenn Dich jemand fragt aus welchem Grund es in der einen Kombination 
funktioniert und in der anderen nicht, kannst Du den Grund nicht nennen!

Ich rate Dir daher ernsthaft, sehr ernsthaft an dieser Stelle nicht 
aufzuhören, sondern den Ratschlägen hier zu folgen.

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
Noch kein Account? Hier anmelden.