www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfacher Messadapter RS232


Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Seit langen mal wieder hier !
Atmel AtTiny13 mit 9,6 MHz interner Oszillator
Mit dem Zeichen U (0x55) initilisiert sich der Software URAT (Auto 
BAUDing 300 - 115200). Erwartete Antwort kommt !
Mit dem Zeichen 0 (0x30) kann ich dann den logischen Zustand vom PB2 bis 
PB5 (nicht wirklich PB5 da noch Reset) lesen (Pull-Up setzen)
Mit dem Zeichen 8 (0x38) starte ich einen Sreamread der Ports.
Klappt besser als ich es mir erträumt hätte. Bei allen BAUT-Raten bis 
jetzt keine Bitfehler.

Nun das Ganze mit AD-Wandler, und das geht eben nicht mehr.
Mit dem Zeichen 4 (0x34). Ausgabe ist im Test auf o und k vorbelegt.
Die Routine gibt aber nicht mal die geechote 4 aus.

NextAD:
  inc r16
  out ADMUX,r16
  lsr r18
  brcc Not2read
  ;LowNoiseAD zerstört r16 und r17
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|1<<SM0
  out MCUCR,r16
  in r16,ADCSRA
  cbr r16,0b11111000
  sbr r16,1<<ADEN|1<<ADSC|0<<ADATE|0<<ADIF|1<<ADIE
  out ADCSRA,r16
  sleep
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|0<<SM0
  out MCUCR,r16
  in r16,ADCH
ldi r16,'o'
  rcall SendData

  in r17,ADCL
  in r16,ADMUX
Not2read:
  lsr r19
  lsr r19
  or r19,r17
  brcc NextAD
  mov r16,r19
ldi r16,'k'
  rcall SendData
  ret

Kommentiere ich aber die follgenden Zeilen aus,
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|1<<SM0
  out MCUCR,r16
  in r16,ADCSRA
  cbr r16,0b11111000
  sbr r16,1<<ADEN|1<<ADSC|0<<ADATE|0<<ADIF|1<<ADIE
  out ADCSRA,r16
  sleep
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|0<<SM0
  out MCUCR,r16
so erhalte ich beim Senden des Zeichens 4 die erwartete Antwort 4ook .
Was passiert hier. Ich müsse doch selbst wenn der Controller stehen 
bleibt trotzdem wenigstens die 4 angezeigt bekommen da das StopBit ja 
noch ausgegeben wird. Jemand ne Idee?

Liebe Grüße Christof

Autor: naat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin

erstmal würde ich die DCD,DTR,DSR Ausgänge der RS232 jeweils über eine 
eigene Diode zusammenfassen , da es passieren kann das diese 
unterschiedliche Pegel aufweisen (Initialisierung)

mfg

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke !
Kann aber nicht passieren, da nur Einer ein Ausgang ist.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christof Rieger schrieb:
> Danke !
> Kann aber nicht passieren, da nur Einer ein Ausgang ist

Das ist das Problem: die Eingänge fressen Dir den Strom weg. (vermutlich 
bricht die Spannung ein sobald der ADC aktiviert wird).
Wenn Du am PC die Schnittstelle auf "no handshake" stellst brauchst du 
die Eingänge nicht. -> DSR und DCD kann entfernt werden.

Gruß Anja

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.K.
Das müssten aber die Kondensatoren abfangen. Mindestens die 4 muss noch 
kommen.

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Anja,
ich habe nochmal die Gegenprobe gemacht.
  ;LowNoiseAD zerstört r16 und r17
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|1<<SM0
  out MCUCR,r16
  in r16,ADCSRA
  cbr r16,0b11111000
  sbr r16,1<<ADEN|1<<ADSC|0<<ADATE|0<<ADIF|0<<ADIE
  out ADCSRA,r16
;  sleep
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|0<<SM0
  out MCUCR,r16
  in r16,ADCH
Sprich den AD-Wandler gestartet aber den Interrupt deaktiviert und den 
sleep deaktiviert. Das dürfte sogar einen höheren Stromverbrauch zur 
Folge haben, da der Core weiter arbeitet. Die erwartete Antwort von 4ook 
erfolgt dann beständig.
Irgend wie muss durch den sleep der auf den AD-Wandler wartet, das ganze 
Timing zu zerrissenwerden, dass der Software URAT außer Tritt kommt. Ich 
kann mir aber nicht erklären warum. Denn bis zum Start des AD-Wandlers 
ist das Senden/Empfangen der 4 bis auf die Wartezeit ende StopBit 
abgeschlossen. Die Nachfollgen Sende-Routine stellt sicher, dass sie 
nicht eher Daten ausgibt bevor nicht mindestens die Dauer eines Bits für 
das Stopbit vergangen ist. Außerdem ist zu keiner Zeit mehr als ein 
Interrupt scharfgeschaltet. Ich finde den Gedankenfehler nicht !

LG Christof

PS: Wenn jemand Muse hat kann er die Schaltung ja mal nachbauen. Wie 
gesagt das einlesen der Digitalen Zustände klappt super.
Zur Initialisierung sendet man einfach nach der Aktivierung der RS232 
ein U (0x55) die Schaltung antwortet dann bei:
115200 und 57600 mit 0 (0x30)
38400 mit 1 (0x30)
...
300 mit 8 (0x38)
Sendert man dann Binär 0b PPPP0000 (P=0 PullUp aus, P=1 PullUp ein)
so bekommt man als EchoAntwort 0b WWWW0000 (W=Logischer Pegel des 
zugehörigen Pins [PB2|PB5|PB3|PB4]
Sendet man Binär 0b PPPP1000 wir als Antwort ein 8-Bit Echo und dann ein 
endlos Stream gesendet.
Ergebnis:
    zu t -0,5   |   zu t -1
[PB2|PB5|PB3|PB4|PB2|PB5|PB3|PB4]
Durch schließen der Schnittstelle wird der Stream gestopt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.