Hallo ich beschäftige mich seit 2 Wochen mit Pic’s. Ich habe den
Pic16f876.
Ich habe folgendes prob. Ich möchte in ein vorhandenes Programm einige
Ausgänge integriert.
Das original Programm habe ich von
http://www.sprut.de/electronic/pic/projekte/thermo/thermo.htm
So und ich habe es folgendermaßen abgewandelt.
#define Offset D'250' ; Offset des PTC
#define Toff1 D'30'
#define Toff2 D'30'
#define Ton1 D'38'
#define Ton2 D'38'
Das sind die werte bei den der Lüfter an bzw aus gehen soll.
Lüfter ein/aus-schalten
Luft1
; prüfen ob Temp<Toff
MOVFW Toff1
subwf f0, w ; w:=f-33 = temp-Toff
btfss STATUS, C
bcf PORTC, 5 ; Lüfter aus
; prüfen ob Temp>Ton
MOVFW Ton1
subwf f0, w ; w:=f-38 = temp-Ton
btfsc STATUS, C
bsf PORTC, 5 ; Lüfter an
return
Luft2
; prüfen ob Temp<Toff
MOVFW Toff2
subwf f0, w ; w:=f-w = temp-Toff
btfss STATUS, C
bcf PORTC, 4 ; Lüfter aus
; prüfen ob Temp>Ton
MOVFW Ton2
subwf f0, w ; w:=f-w = temp-Ton
btfsc STATUS, C
bsf PORTC, 4 ; Lüfter an
return
Die Unterprogramme werden im Hauptprogramm auf gerufen.
Ich weiß niocht was ich falsch gemacht habe kann mir jemand helfen?
Danke im voraus Bodo K.
Hi ist ja super so schnell.
Also ich habe zwei Ausgänge eingefügt Port C4 und C5.
Diese sollen bei 38 Crad angehen und bei 30 Crad Ausgehen.
Dafür habe ich folgendes gemacht.
#define Toff1 D'30'
#define Toff2 D'30'
#define Ton1 D'38'
#define Ton2 D'38'
Für meine aus- einschalt Temperaturen.
; Lüfter ein/aus- schalten
Luft1
; prüfen ob Temp<Toff
MOVFW Toff1
subwf Digit, w ; w:=f-33 = temp-Toff
btfss STATUS, C
bcf PORTC, 5 ; Lüfter aus
; prüfen ob Temp>Ton
MOVFW Ton1
subwf Digit, w ; w:=f-38 = temp-Ton
btfsc STATUS, C
bsf PORTC, 5 ; Lüfter an
return
Luft2
; prüfen ob Temp<Toff
MOVFW Toff2
subwf Digit, w ; w:=f-w = temp-Toff
btfss STATUS, C
bcf PORTC, 4 ; Lüfter aus
; prüfen ob Temp>Ton
MOVFW Ton2
subwf Digit, w ; w:=f-w = temp-Ton
btfsc STATUS, C
bsf PORTC, 4 ; Lüfter an
return
Für die Lüfter.
Ich hoffe diese angaben reichen Dir.
Danke im voraus BodoK.
Ich glaube das habe ich.
Init movlw B'11111111'
movwf PORTB
movwf PORTC ; LED aus
bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'00000000' ; PortB & C alle outputs
movwf TRISB
movwf TRISC
bcf STATUS, RP0 ; Bank 0
movlw B'11111111'
movwf PORTB
movwf PORTC ; LED aus
Bodo wrote:
> Ich weiß nicht was Du für einen Simulator meinst. Wo gibt es so was?
Unter den Annahme, dass Du Microchips MPLAB verwendest:
Debugger -> Select Tool -> MPLAB SIM
Ja ich habe MPLAB aber mit meine englisch ist es nicht so gut bestellt.
Komme damit nicht zurecht. Kennst du vieleicht eine Sim aud deutsch oder
gibt es eine Anleitung in deutsch für MPLAB?
Danke
Schau mal auf der Seite http://www.fernando-heitor.de unter
Downloads-Dokumente nach. Da gibt es ein Tutorial zu MPLAB auf deutsch,
vielleicht hilft es dir ;)
Hallo
Ich finde meinen Denkfehler nicht vielleicht hat ja einer von euch
Profis mir helfen. Zumindest einen Tipp ich möchte es ja auch lernen,
damit ich nicht immer fragen muss. Geht mir ja auch auf die nerven.
Ich bin über jede Anregung dankbar. MFG Bodo K.
Bodo wrote:
> Ich finde meinen Denkfehler nicht vielleicht hat ja einer von euch> Profis mir helfen.
Ob jemand Profi ist, hat damit nichts zu tun.
Du bräuchtest jemanden, der PIC-Asssembler kann und da siehts hier im
Forum ziemlich mau aus.
Hier sind hauptsächlich AVR-ler unterwegs.
Und Postingregel 2 beachten:
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"
Peter
Bodo wrote:
> Hallo>> Ich finde meinen Denkfehler nicht vielleicht hat ja einer von euch> Profis mir helfen. Zumindest einen Tipp ich möchte es ja auch lernen,> damit ich nicht immer fragen muss. Geht mir ja auch auf die nerven.
Wie weit bist Du mit dem Simulator?
Und schau mal nach was MOVFW und MOVLW bewirken resp. was der
Unterschied ist.
Der Denkfehler ist ganz einfach, du verwendest die Variable Digit,
welche das aktuelle Display fuer das Multiplexing der 7-seg Anzeigen
enthaelt (Werte 0-2) und nicht die Temperatur. !!!
Chris
Hi das ist mir auch schon aufgefallen. Das da mein Fehler ist habe das
in f0 geändert.(Ich glaube das das die aktuelle errechnete Temp ist) bin
mir aber nicht sicher das der wert beim Sprung noch da ist.
Ja, der Wert ist in f0 sowie f1, ein 16bit Wert.
du solltest Sub16 benutzen, und vorher den Schwellwert in xw0 sowie xw1
laden. Wenn das Carry gesetzt ist, ist der Wert unterschritten,
andersweitig ist die Temperatur hoeher oder gleich.
**************************************************************
; 16 Bit Subtraktion, bei Überlauf (neg. Ergebnis) ist C gesetzt
Sub16 ; 16 bit f:=f-xw calc=xw cnt=f
clrf Fehler ; extraflags löschen
movf xw0, w ; f0=f0-xw0
subwf f0, f
btfsc STATUS,C
goto Sub16A
movlw 0x01 ; borgen von f1
subwf f1, f
btfss STATUS,C
bsf Fehler, C ; unterlauf
Sub16A
movf xw1,w ; f1=f1-xw1
subwf f1 , f
btfss STATUS, C
bsf Fehler, C ; Unterlauf
bcf STATUS, C
btfsc Fehler, C
bsf STATUS, C
return
Hallo
Zur Verständnis.
Wenn der Wert des einschalt punkt überschritten ist wird ein Flag
gesetzt auf 1.
Aber wie frage ich den Flags ab? Ich glaube das das die Zeile ist mit
btfss STATUS, C.
Aber muss ich nicht noch irgendwo definieren welcher Flags für was ist?
Wie binde ich das in mein Programm ein?
Das mit dem Sub 16 und Sub 16A habe ich ja in meinem Programm schon
drin.
Ich sagte ja schon, bin ein Newbie sorry.
Danke für eure mühe
Bodo wrote:
> Hallo>>>> Zur Verständnis.>> Wenn der Wert des einschalt punkt überschritten ist wird ein Flag> gesetzt auf 1.>> Aber wie frage ich den Flags ab? Ich glaube das das die Zeile ist mit> btfss STATUS, C.
Richtig. Die Flags stehen im Statusregister und werden mit btfss ( Bit
testen im Speicher (f) und skip wenn Bit gesetzt) oder btfsc (Das selbe,
halt nur wenn bit nicht gesetzt) abgefragt.
>> Aber muss ich nicht noch irgendwo definieren welcher Flags für was ist?>
Nein, steht im Datenblatt.
> Wie binde ich das in mein Programm ein?
Die Status Flag werden bei jedem Befehl, den die CPU ausführt durch die
CPU gesetzt. Welche Flags wie und bei welchem Befehl gesetzt werden
erfährst du auch im Datenblatt (bei der Befehlsübersicht). Im
wesentlichen brauchst du aber nur zwei Flags. C (wenn ein Byte
überläuft, nach einer Addition, Subtraktion oder Verschiebebefehle) und
Z (wenn das Ergebnis 0 ist).
>> Das mit dem Sub 16 und Sub 16A habe ich ja in meinem Programm schon> drin.>> Ich sagte ja schon, bin ein Newbie sorry.
Dann ließ mal sprut.de durch. Da erfährst du ganz gut die Grundlagen.
>> Danke für eure mühe
Gerne. Sven
Hallo
Also ich bekomme es einfach nicht hin.
Ich habe mir alles mögliche durchgelesen, finde meinen Fehler nicht.
Wer kann mir BITTE ganz konkret meinen Denkfehler sagen?
Mfg Bodo und DANKE im voraus.
Hallo
Also ich bin der meinung das der Flags Carry immer 1 ist.
Da mein Ausgang immer High ist, egal was ich für eine Temp habe.
Also ist f0 nicht da. zB 0 für aktuelle Temp. - 38Grad für Toff1 = -38
Flegs 1 also Ausgang immer da. Selbst wenn ich 110 Grad am Fühler habe
ändert sich nichts am Ausgang immer High.
HILFE Danke
Gruß Bodo