/* Kommentarzone 1.: Was das hier ist: Dies ist eine "source"-File zur Programmierung eines Microcontrollers (Integrierter Schaltkreis) so dass dieser das Luftfeuchte-Messmodul DHT11 auslesen kann. dieses ist für 80ct o.ä. beim Chinesen erhältlich. Es handelt sich um den Microcontroller Typ DSPIC30F4011 von Microchip. Ich verwende MPLAB IDE v8.90 zur Entwicklung des Programms und zur Programmierung des Controllers mit einem ICD2 -CLON Programmiergerät. (Variante "POTYO" in eigener Sub-Variante). Neuere Versionen von MPLAB sind längst erschienen, sie sind aber hauptsächlich mit Komplikationen hinsichtlich der Hardware etc. verbunden, wenig Verbesserungen für meinen Bedarf, soweit ich weiß. Die File ist in Assembler programmiert und sollte mit geringen Anpassungen auf jedem PIC24 DSPIC30 laufen, da sie nur einen ST-IN/OUT- Port benötigt. und beide Typen in ASM30 programmiert werden. andere Pics-Famillien z.B. PIC16 sind nicht mit diesem Programm kompatibel. nicht alle PIC 30 sind mit dem ICD2-Brenner kompatibel.bei der Auswwahl darauf achten, welchen Brenner man verwenden will. ;--------------- Da diese File ein Ausschnitt aus einem größeren Programm ist, ist auch die Wahl der Bezeichnungen nicht immer ganz logisch, und es macht ev. überflüssige Dinge. Der LOW-Power-Oszillator muss mit einem 32kHz Uhrenquarz bestückt werden -- aber nur, um den Timer2und das DHT-Programm mittels Timer 1 sekündlich zu starten. In einem anderen Programm kann das natürlich anders bewerkstelligt werden. ; Farbübersicht : ;LED LATF,#0 ; = rot ;LED LATF,#1 ; = grün ;LED LATF,#4 ; = gelb ;LED LATF,#5 ; = blau Der DHT11 selber hängt bei mir an PORTF,#6. Er braucht einen Pull-Up (z.B. 1,8 kOhm nach +5V,)sowie einen Masse und einen +5V-Anschluss. kommt aber auch mit etwas niedrigerer VDD klar.(3V-5,5V) LED an PORTF,#2 und #3 würden mit dem ICSP-Anschluss interferieren, sind aber im Prinzip möglich. ;-------------------------- 2. Die Funktion: ;Luft-Feuchte - Messung: ;Aus dem DHT11 Datenblatt: (Luftfeuchte und Temperatur-Mess-Modul, kleines blaues Kästchen mit Löchern) Data consists of decimal and integral parts. A complete data transmission is 40bit, and the sensor sends higher data bit first. Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum. If the data transmission is right, the check-sum should be the last 8bit of "8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data". eine Messung dauert etwa 34 Millisekunden. Dazu muss der T2-Interrupt mit dem Softwaremodul etwa 3400 mal mit 10usec Zeitabstand aufgerufen werden. Zum WEiterprogrammieren: ;Ausgangsgrößen: ;LftFeucBinaerReg ;LftFeucBCDReg ;LftTempBinaeerReg ;LftTempBCDReg ; MyFlags3,#3 ; Start-Flag für DHT11-Abfragung. 1= Abfragung ist grade am laufen 0=Messdaten verfügbar, falls gut. ; MyFlags3,#10 ;1= Messdaten-gut-FLAG / 0=Messdaten z Zt nicht verfügbar, oder verwertbar derzeitige Funktionalität: gelbe LED blinkt, wenn Hauptschleife läuft blaue LED blinkt sekündlich, wenn Daten vom DHT11 korrekt empfangen wurden und den Checksum Test bestanden haben. Rote LED geht bei Temperaturen über 26 Grad Celsius an, Grüne LED geht bei rel Luftfeuchte über 54% an. Diese Auszugsfile ist geprüft und läuft auf meiner Hardware mit allen Funktionen. */ .equ __30F4011,1 ; das hier muß natürlich dem zu verwendenden Controller angepasst werden. Auch hat nicht jeder infragekommende PIC einen PORTF. dann muß natürlich ein anderer ST-Port verwendet werden. .include "p30F4011.inc" ;.............................................................................. ;Configuration bits: Configuration Words ------(1. Template aus ASM30 verwenden, 2.Config-Words aus der INC-file kopiert um gleich die richtige Form zu haben) ;.............................................................................. config __FOSC, FRC_PLL8 & PRI & CSW_FSCM_OFF ;interner schneller RC-Oszillator 8Mhz x8 = 64Mhz ((x16= 128MHz) 120Mhz max erlaubt. wird aber zu warm bei ca 120) ;läuft jetzt auf 64mhZ = 16 Mips (lite 6- 10 nicht mehr ändern, ev. noch Energiesparmodus.Timer1) config __FWDT, WDT_OFF config __FBORPOR, PBOR_OFF &PWRT_16 & MCLR_EN & RST_IOPIN config __FGS, CODE_PROT_OFF ;.............................................................................. ;Program Specific Constants (literals used in code) ;.............................................................................. ; .equ SAMPLES, 64 ;Number of samples ;.............................................................................. ;Global Declarations: ;.............................................................................. .global _wreg_init ;Provide global scope to _wreg_init routine ;In order to call this routine from a C file, ;place "wreg_init" in an "extern" declaration ;in the C file. .global __reset ;The label for the first line of code. .global __T1Interrupt ;Declare Timer 1 ISR name global .global __T2Interrupt .global __T3Interrupt .global __ADCInterrupt .global __MI2CInterrupt ;.............................................................................. ;Constants stored in Program space ;.............................................................................. /* .section .myconstbuffer, code .palign 2 ;Align next word stored in Program space to an ;address that is a multiple of 2 ps_coeff: .hword 0x0002, 0x0003, 0x0005, 0x000A ;.............................................................................. ;Uninitialized variables in X-space in data memory ;.............................................................................. .section .xbss, bss, xmemory x_input: .space 2*SAMPLES ;Allocating space (in bytes) to variable. ;.............................................................................. ;Uninitialized variables in Y-space in data memory ;.............................................................................. .section .ybss, bss, ymemory y_input: .space 2*SAMPLES ;.............................................................................. ;Uninitialized variables in Near data memory (Lower 8Kb of RAM) ;.............................................................................. */ .section .nbss, bss, near ;My Flag-Regs: Register zur Speicherung einzelner Signalisierungs-Bits für meinen eigenen Programmablauf: MyFlags1: .space 2 ;cleared on REset ---für DHT11 nicht benötigt--- MyFlags2: .space 2 MyFlags3: .space 2 ;für DHT11 hauptsächlich benutzt MyFlags4: .space 2 ;cleared on REset ---für DHT11 nicht benötigt--- MyFlags5: .space 2 ;cleared on REset ---für DHT11 nicht benötigt--- MyFlags6: .space 2 ;cleared on REset ---für DHT11 nicht benötigt--- MyFlags7: .space 2 ;cleared on REset ---für DHT11 nicht benötigt--- ;---------------------------- ;InterruptKonfliktVermeidungsPufferungsRegs: (Das mit den shadow-Registern funktioniert ja leider nur bei einem Interrupt und ich hatte mehr) WNullRegBakuptT2_Int: .space 2 WEinsRegBakuptT2_Int: .space 2 StatusRegBakuptT2_Int: .space 2 WNullRegBackuptT1_Int: .space 2 ; WEinsRegBackuptT1_Int: .space 2 StatusRegBackuptT1_Int: .space 2 ;Regs speziell nur für DHT11: Luftm18msTimreg: .space 2 Luuftmess80usDownReg: .space 2 Luffmess80usUPReg: .space 2 Luftmmess50usLowVorDataReg: .space 2 LuftMessgBitlaengenMessReg: .space 2 LftFeucBinaerReg: .space 2 ;die 5 folgenden Register müssen ; muss in dieser Reihenfolge bleiben wegen indirekter Adressierung. LftFeucBCDReg: .space 2 ; muss in dieser Reihenfolge bleiben wegen indirekter Adressierung. LftTempBinaeerReg: .space 2 ; muss in dieser Reihenfolge bleiben wegen indirekter Adressierung. LftTempBCDReg: .space 2 ; muss in dieser Reihenfolge bleiben wegen indirekter Adressierung. LfttDataCheckSumReg: .space 2 ; muss in dieser Reihenfolge bleiben wegen indirekter Adressierung. LfttMess5RegsCountReg: .space 2 LufftMes8BitCountReg: .space 2 T2SoftWDTReg: .space 2 ;RTC: SekReg: .space 2 MinReg: .space 2 StundReg: .space 2 var1: .space 2 ; ev. für Tests LetztesReg: .space 2 ;bis hierher wird von mir bei Reset vorgelöscht ; RESERVIERUNGEN: RESERVIERUNGEN: RESERVIERUNGEN: RESERVIERUNGEN: RESERVIERUNGEN: RESERVIERUNGEN: RESERVIERUNGEN: /* Workregister für reserviert: ;--- reservierte Memory-Bereiche - bislang keine. */ ;.............................................................................. ;Code Section in Program Memory ;.............................................................................. .text ;Start of Code section __reset: MOV #__SP_init, W15 ;Initalize the Stack Pointer MOV #__SPLIM_init, W0 ;Initialize the Stack Pointer Limit Register MOV W0, SPLIM NOP ;Add NOP to follow SPLIM initialization CALL MyINIT ;Call _wreg_init subroutine ;Optionally use RCALL instead of CALL done: NOP ;/* ;Test mit LED an LATF,#4 ob die Hauptprogrammschleife überhaupt läuft. DEC var1 BTSS SR,#Z BRA do2 BTG LATF,#4 ; = gelb Blinken ;*/ do2: BRA done ;Place holder for last line of executed code ;.............................................................................. ;Subroutine: Initialization of W registers to 0x0000 ---und vieles mehr-- ;.............................................................................. ; XX XX XX XX XXXXXXXXXX XX ; XX XXX XX XX XX XX ; XX XX X XX XX XX ; XX XX X XX XX XX ; XX XX XXX XX XX XX ; XX XX XX XX XX XX ; my Init MyINIT: ;_wreg_init: CLR W0 MOV W0, W14 REPEAT #12 MOV W0, [++W14] CLR W14 ; meine Register vor-löschen: MOV #LetztesReg ,W1 MOV #MyFlags1 , W0 ;(erstes Register) MyRegsVorloeschen: CLR [W0++] CPSLT W1 , W0 BRA MyRegsVorloeschen CLR W1 CLR W0 ;Porteinstellungen: clr TRISF ;für LED , die werden auch jenseits von Tests gebraucht. SETM LATF ;erstmal alle LED = aus F0-5 --ich habe sie als Pulldown geschaltet-- BSET TRISF , #6 ; An F6 hängt später der Feuchtemesser DHT11 mit in und Output-Funktion also noch auf Tristate/Input. ;------------------------------------------ ;-Einstellungen für den T1-Interrüpt:---------------------------------------------------------------------------------------------------- ;LP-Oszillator enablen/dafür Schreibschutz von OSCCON aussetzen: ;Byte Write 0x46 to OSCCONL ;Byte Write 0x57 to OSCCONL ;one instruction free to OSCCONL MOV #0x46 ,W0 MOV #0x57 ,W1 MOV #OSCCONL , W2 MOV.B W0 ,[W2] MOV.B W1 ,[W2] BSET OSCCONL , #LPOSCEN ;enable 32Khz external xtal ;-------- Timer am LP-oszillator: CLR T1CON clr TMR1 ; ; BSET T1CON, #15 ( ,#TON) ;T1 einschalten -noch nicht ;Timer1 Period: (zum Start) MOV #0x7FFF ,W0 ;#0x0F00 ,W0 die Timer zählen aufwärts bis PR und resetten dann große Zahl also niedr. Freq. MOV W0,PR1 ;interrupts every 1.0 Sec bei max prescaler BSET T1CON, #TCS ;#1 ; external clock used -- aber ist Lposc "external"? ;Interrupteinstellungen: ;t1 int: BCLR IPC0 , #14 BCLR IPC0, #13;Priorität1. IPC-Register standardwert 4 (0-7)(-je ein Nibble für einen Interrupt(-Vektor) der oberste (in IPC0)ist Tmr1 von rechts gezählt BSET IPC0 , #12 BSET IEC0, #3;T1IE ;enable T1#11 verbürgt original Datenblatt dieser pic und getestet BCLR IFS0, #3 ;#T1IF ;Clear the Timer1 Interrupt flag Status ;------------------------------------------------------------------------------------------------ ;----------------- ;Interrupteinstellungen für T2-Interrupt: ;DHT11-Luftmessung: ;Timer2 Vor-Einstellungen: 100kHz bei 16 Mip/s = 160 für PR =einiges weniger als 160 Instructions pro Interrupt-Ausführung. geplant ist, den Interrupt nur in kurzen Serien loszulassen für je eine DHT11-Luftmessung/minute. CLR T2CON ; Stops the Timer2 and reset control reg. CLR TMR2 ; Clear contents of the timer register MOV #160, W0 ; Load the Period register MOV W0, PR2 ; with that value BSET IPC1, #T2IP0 ; Setup Timer2 interrupt for Priority 5, z Zt höchste im Skript,(ist dafür aber fast immer aus) BCLR IPC1, #T2IP1 ; desired priority level BSET IPC1, #T2IP2 ; (this example assigns level 7 priority) BCLR IFS0, #T2IF ; Clear the Timer2 interrupt status flag BSET IEC0, #T2IE ; Enable Timer2 interrupts ; BSET T2CON, #TON ; Start Timer2 with prescaler settings at 1:1 and clock source set to the internal instruction cycle -- jetzt nicht, nur bei Bedarf. ;----------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------Und zuletzt alle selbstlaufenden Timings noch starten: hier nur T1 BSET T1CON, #TON ;T1 einschalten RETURN ;------------------------------Ende INIT------------------------------- ;............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;............................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;....................................................XXXXXX ;....................................................XXXXXX ;....................................................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX........................XXXXXXX ;....................................................XXXXXX.......................XXXXXXXX ;....................................................XXXXXX......................XXXXXXXXX ;....................................................XXXXXX.....................XXX.XXXXXX ;....................................................XXXXXX....................XXX..XXXXXX ;....................................................XXXXXX...................XXX...XXXXXX ;....................................................XXXXXX..................XXX....XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX ;....................................................XXXXXX.........................XXXXXX __T1Interrupt: ;-- DISI #4 MOV W0 , WNullRegBackuptT1_Int;InterruptKonfliktVermeidungsPufferungsRegs: MOV W1 , WEinsRegBackuptT1_Int MOV SR , W0 MOV W0 , StatusRegBackuptT1_Int ;------------------------ ;XXX......XXXX.......XXXXXXXX...XXXXXXXX..XXXXXXX.........XXX..XXX...XXXXXXXX...XXX........XXXX ;XXX..XXX..XXX..XXXXXXXXXXXX..X..XXXXXXX..XXXXXXXXXXX..XXXXXX..XXX..X..XXXXX....XXX..XXXXXXXXXX ;XXX..XXXX..XX..XXXXXXXXXXX..XXX..XXXXXX..XXXXXXXXXXX..XXXXXX..XXX..XX..XXX..X..XXX..XXXXXXXXXX ;XXX..XXX..XXX.......XXXXX..XXXXX..XXXXX..XXXXXXXXXXX..XXXXXX..XXX..XXX..X..XX..XXX.........XXX soft RTC ;XXX....XXXXXX..XXXXXXXXX...........XXXX..XXXXXXXXXXX..XXXXXX..XXX..XXXX..XXXX..XXX..XXXXXXXXXX ;XXX..X..XXXXX..XXXXXXXX..XXXXXXXXX..XXX..XXXXXXXXXXX..XXXXXX..XXX..XXXXXXXXXX..XXX..XXXXXXXXXX ;XXX..XXX..XXX.......XX..XXXXXXXXXXX..XX........XXXXX..XXXXXX..XXX..XXXXXXXXXX..XXX........XXXX ; hier sekündlich: BSET T2CON, #TON ; Start Timer2 with prescaler settings at 1:1 and clock source set to the internal instruction cycle jetzt nicht, nur bei Bedarf. BSET MyFlags3,#3 ;LuftFMessg Start Flag. 1=LOS Reealtime: INC SekReg MOV #60 , W0 CP SekReg BRA NC, TimeRiplFrtg CLR SekReg ;minütliches: ;hier minütlich auszuführende Befehle eintragen: ;----------------- INC MinReg MOV #60 , W0 CP MinReg BRA NC, TimeRiplFrtg CLR MinReg ;stündliches: ;-------------- INC StundReg MOV #24 , W0 CP StundReg BRA NC, TimeRiplFrtg CLR StundReg ;tägliches: ;------------------- TimeRiplFrtg: NOP T1Out: DISI #4 MOV StatusRegBackuptT1_Int , W0 ;InterruptKonfliktVermeidungsPufferungsRegs: MOV W0 , SR MOV WEinsRegBackuptT1_Int , W1 MOV WNullRegBackuptT1_Int , W0 BCLR IFS0,#3;T1IF ;Clear the Timer1 Interrupt flag Status bit. RETFIE ;Return from Interrupt Service routine ;------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;........T2T2T2T2T2T2T2T2T2T2......T2T2T2T2................ ;................T2T2............T2T2.....T2T2............. ;................T2T2......................T2T2............ ;................T2T2......................T2T2............ ;................T2T2.....................T2T2............. ;................T2T2...................T2T2............... ;................T2T2.................T2T2................. ;................T2T2...............T2T2................... ;................T2T2.............T2T2..................... ;................T2T2...........T2T2T2T2T2T2T2T2........... /* ;Luft-Feuchte - Messung: ;Aus dem DHT11 Datenblatt: (Luftfeuchte und Temperatur-Mess-Modul, kleines blaues Kästchen mit Löchern) Data consists of decimal and integral parts. A complete data transmission is 40bit, and the sensor sends higher data bit first. Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum. If the data transmission is right, the check-sum should be the last 8bit of "8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data". eine Messung dauert etwa 34 Millisekunden. Dazu muss der T2-Interrupt mit dem Softwaremodul etwa 3400 mal mit 10usec Zeitabstand aufgerufen werden. ;Ausgangsgrößen: ;LftFeucBinaerReg ;LftFeucBCDReg ;LftTempBinaeerReg ;LftTempBCDReg ; MyFlags3,#3 ; Start-Flag für DHT11-Abfragung. 1= Abfragung ist grade am laufen 0=Messdaten verfügbar, falls gut. ; MyFlags3,#10 ;1= Messdaten-gut-FLAG / 0=Messdaten z Zt nicht verfügbar, oder verwertbar */ __T2Interrupt: ;---------------garnicht oder mit 100 kHz--100khz:getestet: lite14------------------------------------------ DISI #4 MOV W0 , WNullRegBakuptT2_Int;InterruptKonfliktVermeidungsPufferungsRegs: MOV W1 , WEinsRegBakuptT2_Int MOV SR , W0 MOV W0 , StatusRegBakuptT2_Int ;-------------------------------------------------------------------- ;Soft-Watchdog: MOV #7000 , W0 INC T2SoftWDTReg ;software-watchdog: wenn auch nach genug Zeit für einen Durchgang und einen Error-Durchgang die T2-Interrupts immer noch nicht aufhören, CP T2SoftWDTReg ; dann werden sie resettet. Hilft nicht gegen alle Eventualitäten, aber die wahrscheinlichsten( z.B.Hängenbleiben des ganzen Programms wegen Hardware-Defekt an Sensor) BTSC SR , #C BRA LftmessAbschluss ;Inhalt Abfrage des DHT11-Luftfeuchte-Sensor-Moduls mit 100 Khz / 10usec Interrupt-Grundfrequenz: BTSS MyFlags3,#3 ;LuftFMessg Start Flag. 1=LOS BRA LuftmessFrtg BTSC MyFlags3,#4 ;LuftFMessg >/==18ms puuDownflag, 0= 18msPhase ist im Gange, oder Messg ganz abgeschlossen. 1=andere Phase der Luftmessg. größer 18ms also 30ms wers eilig hat, machts knapper. BRA LuftmessPhase2 ;---------- BCLR TRISF,#6 ;Pull-down performen BCLR LATF,#6 ;Pull-down performen INC Luftm18msTimreg MOV #3000 , W0 ;3000für 30ms CP Luftm18msTimreg BTSS SR , #C BRA LuftmessFrtg BSET TRISF,#6 BSET MyFlags3,#4 ;erledigt: LuftFMessg >/==18ms puuDownflag, 1=andere Phase der Luftmessg beginnt/läuft. größer 18ms: (30ms) CLR Luftm18msTimreg ;einmalige Abfragestart-Angelegenheiten: MOV #7 , W0 MOV W0 , LufftMes8BitCountReg ;auf Startwert setzen. CLR LfttMess5RegsCountReg CLR LuftMessgBitlaengenMessReg BCLR MyFlags3,#10 ;1= Messdaten-gut-FLAG Da die Regs neu geschrieben werden sind sie eine Zeitlang nich verfügbar. ;-------------- LuftmessPhase2: ;Luftmessphase2 (inclusive aller folgenden wird ungefähr 350 mal pro Messung mit 100Khz angefahren, d.h. abgesehen vom langen Startimpuls dauert das ganze 3,5ms BTSC MyFlags3,#5 ;1= 80us pullDown und 80us pullup anschließend by DHT-Phase bestätigt-Flag BRA LuffttmessPhase4 ;(Datenempfangsphase) ;------------------------- DHT je 80us PullDon / PullUp - initial-Phase: --------------------------------------------------------------------------- BTSC MyFlags3,#7 ;1= 80us pullDown by DHT-Phase bestätigt-Flag BRA LufftmessPhase3 ;--------------------------warten auf 80usPulldown by DHT mit 1k8 ok:----------- ;hat das release Richtung 1k8 pull up funktioniert? BTSC PORTF,#6 ; inOut port für an DHT11 BSET MyFlags3,#6 ;NachInitphase war mal H - Flag (über 1k8R upgepullt) 20-30msReaktionszeit von DHT auf Startsignal BTSS MyFlags3,#6 BRA LuftmessFrtg ;ja: ;haben/hatten wir einen 80us pull - down by DHT? ;nach n20-40ms pull up by 1k8 R: (mindestens 10) warten auf pull down (80ms) durch DHT BTSC PORTF,#6 ;sicherstellen, dass die 80usec-L messung nicht zwei nicht zusammenhängende Impulse zählt. CLR Luuftmess80usDownReg ;solange noch (oder wieder) H Messung zurücksetzen. BTSC PORTF,#6 ;messen, ob BRA LuftmessFrtg ;es ist noch H ;die mutmassliche 80ms pulldownphase hat begonnen: Dauermessung: INC Luuftmess80usDownReg MOV #7 , W0 ; bei 80us muss mindestens 7 mal ein Treffer dabei sein. -also praktisch- mit 6 oder 7 gehts immer mit 8 nímmer CP Luuftmess80usDownReg BTSS SR , #C BRA LuftmessFrtg BSET MyFlags3,#7 ;1= 80us pullDown by DHT-Phase bestätigt-Flag CLR Luuftmess80usDownReg BRA LuftmessFrtg ;------------------------------------ LufftmessPhase3: BTSS PORTF,#6 ; CLR Luffmess80usUPReg ;sicherstellen, dass die 80usec-H messung nicht zwei nicht zusammenhängende Impulse zählt. BTSS PORTF,#6 ; inOut port für an DHT11 BRA LuftmessFrtg ;es ist noch L ;die mutmassliche 80ms pull-UP-phase hat begonnen: INC Luffmess80usUPReg MOV #8 , W0 ; bei 80us muss mindestens 7 mal ein Treffer dabei sein. -also praktisch- Tested 7 oder 8 geht hier, 9 geht nicht. (möglw geht anderes Exemplar nicht mit 8, nur mit 7!!!!!!!!!!!!!!!!) CP Luffmess80usUPReg BTSS SR , #C BRA LuftmessFrtg BSET MyFlags3,#5 ;1= 80us pullDown und 80us pullup anschließend by DHT-Phase bestätigt-Flag .öst Phase 4 aus CLR Luffmess80usUPReg BRA LuftmessFrtg ;-------------------------------Datenempfangsphase:--------------------------------------------------------------------------------------------------- LuffttmessPhase4: BTSC MyFlags3,#8 ;Data-los-Flag BRA LuftmmessPhase5 BTSC PORTF,#6 ; CLR Luftmmess50usLowVorDataReg ;zwischenstörungen ausschließen BTSC PORTF,#6 ; inOut port für an den DHT11 BRA LuftmessFrtg ;es ist noch H ;die mutmassliche 50ms pulldownphase vor einem DAtenbit hat begonnen: Dauermessung: INC Luftmmess50usLowVorDataReg MOV #3 , W0 ;3: bei 50us muss mindestens 4 mal ein Treffer dabei sein. -also praktisch- aber ein Durchlauf geht ab von Phase 6 richtung BitgemessenPhase7 ohne hier durchzulaufen, also 3 s.u.phase6 CP Luftmmess50usLowVorDataReg BTSS SR , #C BRA LuftmessFrtg BSET MyFlags3,#8 ;Data-los-Flag CLR Luftmmess50usLowVorDataReg BRA LuftmessFrtg ;------------------Bit erkennungs-phase ob 0 oder 1 je nach Länge:----- ;1. warten auf das Bit: LuftmmessPhase5: BTSC MyFlags3,#9 ;es wurde ein Bit begonnen aber noch nich klar welches BRA LuuftmmessPhase6 BTSS PORTF,#6 ; inOut port für an DHT11 BRA LuftmessFrtg ;es ist noch Low BSET MyFlags3,#9 ;es wurde ein Bit begonnen aber noch nich klar welches ; BRA LuftmessFrtg ;kann eigentlich gleich einmal durchlaufen - ev. genauer. (0-Bit = 26 bis 28 usec) ;2. Bitlänge: LuuftmmessPhase6: BTSS PORTF,#6 ; inOut port für an DHT11 BRA LuffttmessEinBitGemessPhasse7 ;Port clr ein Bit ermittelt. Es geht nach "Phase 7" war aber nicht vorher durch die 50usec-Phasenmessung gelaufen Es entfällt also dort ein Durchgang. Deshalb dort nur 3 statt 4 für 50usec. ;einlesen, bis wieder Low: INC LuftMessgBitlaengenMessReg MOV #9 , W0 ; bei 80us muss mindestens 7 mal ein Treffer dabei sein. -also praktisch- endet normalerweise nicht durch erreichen der Neun sondern durch Port-wieder clr >>Phase 7 nach 2 oder 7 Durchläufen je nach signalisiertem Bit. CP LuftMessgBitlaengenMessReg BTSS SR , #C BRA LuftmessFrtg BRA LuftmessError ;---------------------------------- LuffttmessEinBitGemessPhasse7: MOV #LftFeucBinaerReg , W0 ;Addresse ADD LfttMess5RegsCountReg , WREG ;Offset addieren MOV W0 , W6 MOV LufftMes8BitCountReg , W7 MOV #5 , W0 ; 40usec ist schön in der Mitte CP LuftMessgBitlaengenMessReg BSW.C [W6] , W7 ;Das Bit wird in das Messdatenregister geschrieben. (LftFeucBinaerReg und folgende 4) ;LuftMesEinBitFrtgLk: BCLR MyFlags3,#8 ;einmal erledigt:Data-los-Flag BCLR MyFlags3,#9 ;einmal erledigt: es wurde ein Bit begonnen aber noch nich klar welche CLR LuftMessgBitlaengenMessReg ; erneuern ;--neue Bitposition festlegen: DEC LufftMes8BitCountReg BTSS SR , #C BRA LuftMeesEinBitFrtgLk2 BRA LuftmessFrtg LuftMeesEinBitFrtgLk2: MOV #7 , W0 MOV W0 , LufftMes8BitCountReg ;erneuern, wenn unter Null INC2 LfttMess5RegsCountReg ;0-8 MOV #9 , W0 ;oder #10 egal CP LfttMess5RegsCountReg BRA NC , LuftmessFrtg ;---------- jedes 40ste Bit: CLR LfttMess5RegsCountReg ;Data-Check alle 4 Ergebnis-Register müssen gleich dem check-sum-reg sein: MOV LftFeucBinaerReg , W0 ADD LftFeucBCDReg , WREG ADD LftTempBinaeerReg , WREG ADD LftTempBCDReg , WREG CP.B LfttDataCheckSumReg ;Compute (f) – (WREG) and update the STATUS register (aber nur das untere Byte.(.B)) BTSS SR , #Z BRA LuffDatCheckSchlecht BSET MyFlags3,#10 ;1= Messdaten-gut-FLAG BCLR MyFlags3,#11 ;1.Wiederholflag -- Bei Error wird die Messung wiederholt, das sollte aber nicht in Endlosschleife gehen. BTG LATF,#5 ; = blau !!!!!!!!!!!!!!!!!!blinkt sekündlich, wenn Datenauslesung gut. BRA LftmessAbschluss ;Z=1 die Checksum-Rechnung ist also aufgegangen, die Daten sind gut. LuffDatCheckSchlecht: BCLR MyFlags3,#10 ;1= Messdaten-gut-FLAG BRA LuftmessError ;---------------------------------------------------------- LuftmessError: BTSC MyFlags3,#11 ;1.Wiederholflag - BRA LftmessAbschluss BSET MyFlags3,#11 ;1.Wiederholflag -- Bei Error wird die Messung wiederholt, das sollte aber nicht in Endlosschleife gehen.Deshalb nur einmal 1= es wurde bereits eine Wh gestartet. BRA LuftmssAbschlussB ;Wenn Wiederaufnahme gewünscht das Anhalten überspringen. LftmessAbschluss: BCLR MyFlags3,#3 ;LuftFMessg Start Flag. 1=LOS BCLR T2CON, #TON ; Stop Timer2 weil nur störend wenn keine Messg. LuftmssAbschlussB: BCLR MyFlags3,#4 BCLR MyFlags3,#5 BCLR MyFlags3,#6 BCLR MyFlags3,#7 BCLR MyFlags3,#8;F3,8: Data-los-Flag --muß aber auch zwischendurch zurückgesetzt werden ca 40 mal. BCLR MyFlags3,#9 CLR LuftMessgBitlaengenMessReg CLR LfttMess5RegsCountReg CLR Luftm18msTimreg CLR Luftmmess50usLowVorDataReg CLR Luuftmess80usDownReg CLR Luffmess80usUPReg MOV #7 , W0 MOV W0 , LufftMes8BitCountReg ;auf Startwert setzen. CLR T2SoftWDTReg LuftmessFrtg: MOV #27 , W0 CP LftTempBinaeerReg BTSC SR , #C BCLR LATF,#0 ;rot!!!!! ; warm: rote LED leuchtet über 26 Grad C.!!!!!!!!!!! BTSS SR , #C BSET LATF,#0 ;rot!!!!! MOV #55 , W0 CP LftFeucBinaerReg BTSC SR , #C BCLR LATF,#1 ;grün!!!!! ; feucht: rote LED leuchtet über 54% rel Luftfeuchte. !!!!!!!!!!! BTSS SR , #C BSET LATF,#1 ;grün!!!!! ;-------------------------------------------------------------------------------------------------------- DISI #4 MOV StatusRegBakuptT2_Int , W0 ;InterruptKonfliktVermeidungsPufferungsRegs: MOV W0 , SR MOV WEinsRegBakuptT2_Int , W1 MOV WNullRegBakuptT2_Int , W0 BCLR IFS0, #T2IF ; Clear the Timer2 interrupt status flag RETFIE ;------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------- .end ;End of program code in this file ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; Farbübersicht : ;LED LATF,#0 ; = rot ;LED LATF,#1 ; = grün ;LED LATF,#4 ; = gelb ;LED LATF,#5 ; = blau */