Hallo an alle Hilfswilligen,
Für den Pufferspeicher unserer Heizung (Wassertank) baue ich ein
16-Kanal-Thermometer. Der PIC 16F872 steuert einen MOS 4067 MUX/DEMUX an
der dann das Signal eines der NTC-Sensoren zum AN0 des PIC weiterleitet.
Da der 16F872 keinen asynchrone Serielle Schnittstelle besitzt habe ich
diese nach der Anleitung von Sprut emuliert.Da ich einen MAX232 verwende
habe ich die Signale gegenüber der Anleitung von Sprut invertieren
müssen.
Der MOS4067 wird korrekt angsteuert und liefert auch die korrekten
Signale an AN0,, der MAX232 liefert laut Oszi ebenfalls saubere Signale.
Die von der RS232 zum PC gesendeten Daten sollen folgendes Format haben:
Kanalnummer(15-0),Adresh,Adresl
Beispiel: 15,131,128
14,131,64
13,....usw fortlaufend.
PIC Ausgänge: RB0 für die emulierte serielle Schnittstelle.
RB1-RB5 zur Ansteuerung des 4067
PIC Eingänge: AN0 nimmt das Signal vom 4067 entgegen
Beim ADC und der emulierten seriellen Schnittstelle habe ich jedoch
Probleme. Der PIC weigert sich äussertst beharrlich ADRESL korrekt
auszugeben. Der Wert ist immer 127. Warum?
Die in Zeile 64 enthaltene Anweisung call Warte_s1 erzeugt bei jeder
Anzeige eines Wertes je Kanal eine führende 0! D.h. 0, Kanalnummer,
Adresh,Adresl(immer 127).
Auch das kann ich mir nicht erklären.
Es wäre toll, wenn sich jemand dieser Probleme annehmen würde.
Raimund wrote:
> Da der 16F872 keinen asynchrone Serielle Schnittstelle besitzt habe ich> diese nach der Anleitung von Sprut emuliert.
Warum nimmst Du keinen PIC mit UART, z.B. 16F873 oder '876 oder '883?
Wenn Du den Thermometer nicht in grosser Serie baust, spielt ein
eventueller Mehrpreis (eventueller deshalb, weil uralte PICs manchmal
teurer sind als neue, leistungsfähigere).
Hallo Severino,
ich habe noch von Basteleien vorher einen grösseren Posten 16F872
herumliegen. Die möchte ich erst einmal verarbeiten.
Sollte ich das Problem nicht in den Griff kriegen werde ich deinen Rat
beherzigen.
Ein anderer PIC würde aber meines erachtens das Problem mit ADRESL auch
nicht lösen.
Danke
Ich denke halt, das Leben ist kompliziert genug, weshalb sollte man es
sich noch mehr verkomplizieren?
Was kostet Dich einPIC, und wieviel Zeit hast Du nun mit dem SortUART
aufgewendet?
Bist Du denn sicher, dass der PIC auch wirklich das sendet, was er
A/D-wandelt?
Oder anders gesagt: versuch doch mal, Konstanten zu senden, und schau
was beim PC ankommt.
Am besten mal die Extremwerte, die der A/D-Wandler liefern kann.
Hast Du einen ICD2 oder einen PICkit2?
Dann könntest Du Breakpoints setzen und die Register untersuchen.
Du schaltest vor dem Lesen von ADRESL auf Bank1 das ist richtig.
Deine Variable xw0 liegt aber in Bank0 und du schaltest erst nach dem
Schreiben in xw0 wieder auf Bank0. Du musst also vor dem Schreiben nach
xw0 die Bank wieder umschalten.
Sven
Der Pic sendet den ADRESH-Teil des 10 Bit-Ergebnisses einwandfrei und
reproduzierbar an den PC, nur den ADRESL nicht. Als Konstante habe ich
auch schon 'Hallo' und andere spannende Sachen tadellos übertragen
können.
Wie gesagt wenn es auch mit Hilfe nicht klappt dann werde ich mir neue
bzw. auch modernere PICs zulegen.
Ich schreibe die Programme mit dem MPLAB und brenne sie mit dem
USB-Brenner von Sprut.
Bin ich jetzt gemeint? Ich denke nicht....
Aber trotzdem noch mal zum Verständnis:
1
movf ADRESH,0 ; obere 2 Bit auslesen
2
movwf xw1 ; obere 2-Bit nach xw1
3
bcf STATUS,RP1 ; Bank 1
4
bsf STATUS,RP0 ; Bank 1
5
movf ADRESL,0 ; untere 8 Bit auslesen
6
movwf xw0 ; untere 8-Bit nach xw0 <---- DA IST NOCH BANK1 AKTIV!!!
7
bcf STATUS,RP0 ; Bank 0
8
bcf STATUS,RP0 ; Bank 0
Bei der speicherung nach xw0 ist noch Bank1 aktiv! Dein Wert landet also
nicht auf Adresse 0x28, sondern auf Adresse 0xA8. Den Wert den du dann
später ausliest liegt aber in Bank0 da du ja vorher dahin umgeschaltet
hast. Du musst es also so machen:
Sven Stefan wrote:
> Du schaltest vor dem Lesen von ADRESL auf Bank1 das ist richtig.> Deine Variable xw0 liegt aber in Bank0 und du schaltest erst nach dem> Schreiben in xw0 wieder auf Bank0. Du musst also vor dem Schreiben nach> xw0 die Bank wieder umschalten.>> Sven
Hast Recht!
Hallo Sven,
dein Tipp hats gebracht. Vielen Dank. Ich hätte noch Stunden hier
zugebracht bis mir eigefallen wäre dass für Variablen die Speicherbänke
ja auch gelten.
ADRESL wird jetzt korrekt übertragen!
Nochmals Dank
Gruss
Raimund