Forum: Mikrocontroller und Digitale Elektronik Einfacher Messadapter RS232


von Christof Rieger (Gast)


Angehängte Dateien:

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

von naat (Gast)


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

von Christof Rieger (Gast)


Lesenswert?

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

von Anja (Gast)


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

von Christof Rieger (Gast)


Lesenswert?

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

von Christof Rieger (Gast)


Lesenswert?

Hallo Anja,
ich habe nochmal die Gegenprobe gemacht.
1
  ;LowNoiseAD zerstört r16 und r17
2
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|1<<SM0
3
  out MCUCR,r16
4
  in r16,ADCSRA
5
  cbr r16,0b11111000
6
  sbr r16,1<<ADEN|1<<ADSC|0<<ADATE|0<<ADIF|0<<ADIE
7
  out ADCSRA,r16
8
;  sleep
9
  ldi r16, 0<<PUD|1<<ISC00|0<<ISC01|1<<SE|0<<SM1|0<<SM0
10
  out MCUCR,r16
11
  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.

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.