TEST.asm


1
.nolist
2
.include "m88def.inc"
3
.list
4
             
5
.equ clock=7372800                   ; Systemtakt in Hz 
6
.equ BAUD0 = 76800
7
.equ  cr=  13  ;ASCII-Code für CR
8
9
10
11
12
13
14
;Eingangsmelde LEDs
15
.equ led1_port= portC        
16
.equ led1_ddr=  ddrC
17
.equ led1_bit=   pc0
18
19
.equ led2_port= portC        
20
.equ led2_ddr=  ddrC
21
.equ led2_bit=   pc1
22
23
.equ led3_port= portC        
24
.equ led3_ddr=  ddrC
25
.equ led3_bit=   pc2
26
27
.equ led4_port= portC        
28
.equ led4_ddr=  ddrC
29
.equ led4_bit=   pc3
30
31
.equ led5_port= portC        
32
.equ led5_ddr=  ddrC
33
.equ led5_bit=   pc4
34
35
.equ onled_port= portC        
36
.equ onled_ddr=  ddrC
37
.equ onled_bit=   pc5
38
39
40
;*******************************
41
42
43
44
45
46
47
.def buffer  = r0     
48
.def srsk        =r3                ;SREG-Siko
49
.def null=r5                ;immer Null
50
.def sregtemp = r9          ;Sicherheitskopie SREG
51
.def befehl  =  r10             ;enthält den auszugebenden 8bit-befehl
52
53
.def temp4  =  r16
54
.def temp  =  r17
55
.def temp1  =  r18
56
.def temp2  =  r19
57
.def temp3  =  r20
58
.def temp5  =  r21
59
60
.def dta  =  r24
61
.def ialarm  =  r25
62
63
.dseg                   ;SRAM-Variablen 
64
65
temp_lsb:          .byte 1  
66
temp_msb:          .byte 1 
67
th_reg:            .byte 1 
68
tl_reg:            .byte 1 
69
res1:              .byte 1 
70
res2:              .byte 1 
71
count_re:          .byte 1 
72
count_pc:          .byte 1 
73
crc:               .byte 1 
74
id_rom:            .byte 1 
75
rsbuff:            .byte 6 
76
77
tim0z_1:           .byte 1     ;Zähler1 Timer0
78
79
80
.cseg
81
.org  0
82
; hier geht das Programm los
83
; Interrupt-Vektoren
84
;
85
86
87
   rjmp  start;  Reset Handler
88
  rjmp nix; rjmp   EXT_INT0:  reti   ; IRQ0 Handler
89
  rjmp nix; rjmp   EXT_INT1:  reti   ; IRQ1 Handler
90
  rjmp nix; rjmp   PCMINT0:  reti   ; PCINT0 Handler
91
  rjmp nix; rjmp   PCMINT1:  reti   ; PCINT1 Handler
92
  rjmp nix; rjmp   PCMINT2:  reti   ; PCINT2 Handler
93
  rjmp nix; rjmp   WDT:  reti   ; Watchdog Timer Handler
94
  rjmp nix; rjmp   TIM2_COMPA:  reti   ; Timer2 Compare A Handler
95
  rjmp nix; rjmp   TIM2_COMPB:  reti   ; Timer2 Compare B Handler
96
  rjmp nix; rjmp   TIM2_OVF:  reti   ; Timer2 Overflow Handler
97
  rjmp nix; rjmp   TIM1_CAPT:  reti   ; Timer1 Capture Handler
98
  rjmp nix; rjmp   TIM1_COMPA;:  reti   ; Timer1 Compare A Handler  GEHT111111111111
99
  rjmp nix; rjmp   TIM1_COMPB:  reti   ; Timer1 Compare B Handler
100
  rjmp nix; rjmp   TIM1_OVF:  reti   ; Timer1 Overflow Handler
101
  rjmp nix; rjmp   TIM0_COMPA:  reti   ; Timer0 Compare A Handler
102
  rjmp nix; rjmp   TIM0_COMPB:  reti   ; Timer0 Compare B Handler
103
 rjmp   TIM0_OVF  ;reti   ; Timer0 Overflow Handler
104
  rjmp nix; rjmp   SPI_STC:  reti   ; SPI Transfer Complete Handler
105
  rjmp nix; rjmp   USART_RXC:  reti    ; USART, RX Complete Handler
106
  rjmp nix; rjmp   USART_UDRE:  reti    ; USART, UDR Empty Handler
107
  rjmp nix; rjmp   USART_TXC:  reti    ; USART, TX Complete Handler
108
  rjmp nix; rjmp   ADCC:  reti    ; ADC Conversion Complete Handler
109
  rjmp nix; rjmp   EE_RDY:  reti    ; EEPROM Ready Handler
110
  rjmp nix; rjmp   ANA_COMP:  reti    ; Analog Comparator Handler
111
  rjmp nix; rjmp   TWI:  reti    ; 2-wire Serial Interface Handler
112
  rjmp nix; rjmp   SPM_RDY:  reti    ; Store Program Memory Ready Handler
113
114
nix:                    ;unbenutzte Interrupts
115
 rjmp nix
116
 reti                   ;zurück...
117
118
119
     
120
start:
121
122
 ldi temp, high(RAMEND)       ;Stackpointer
123
 out SPH,temp                 ;initialisieren
124
 ldi temp, low(RAMEND)
125
 out SPL,temp
126
127
128
129
130
131
132
133
134
;Eingänge konfigurieren
135
;************************
136
  ;PORTB
137
  ldi  temp,0b00111100 ;PortB, B2-B5 Aus, B1 Ein, B0 Ein, 
138
  out  ddrb,temp    
139
  ldi  temp,0b00000001 ;PortB, B0, B2-B5  Pullup ein
140
  out  portb,temp    
141
;************************
142
;PORTD
143
  ldi  temp,0b00000010 ;PortD, nur TXD als Ausgang
144
  out  ddrd,temp    
145
  ldi  temp,0b11111111 ;PortD, Pullup für Alarm/Taster
146
  out  portd,temp    
147
148
;PORTC
149
 sbi led1_port-1,led1_bit            ; Ausgang
150
 sbi led2_port-1,led2_bit            ; Ausgang
151
 sbi led3_port-1,led3_bit            ; Ausgang
152
 sbi led4_port-1,led4_bit            ; Ausgang
153
 sbi led5_port-1,led5_bit            ; Ausgang
154
 sbi onled_port-1,onled_bit          ; Ausgang
155
156
157
158
159
;UART Initalisierung
160
161
 ldi  temp,high((clock/(16*baud0))-1) ;einstellen
162
  sts  ubrr0h,temp    ;Baudratenwert H setzen
163
164
 ldi  temp,low((clock/(16*baud0))-1)  ;RS232-1 auf 9600 Baud
165
  sts  ubrr0l,temp    ;Baudratenwert L setzen
166
167
 ldi temp, (1<<UMSEL01)|(1<<ucsz01)|(1<<ucsz00);(1<<UCSZ00)|(1<<UCSZ01)|(1<<USBS0);
168
  sts  ucsr0c,temp    ;Datenformat setzen 8data, 1stop bit 
169
170
  ldi  temp,(1<<RXEN0)|(1<<TXEN0);RX mit Interrupt aktivieren
171
  sts  ucsr0b,temp    ;Einstellungen setzen
172
173
174
175
;clk256
176
 ldi temp,(1<<wgm02)|(1<<cs02)|(0<<cs01)|(0<<cs00)  
177
 out TCCR0B,temp
178
179
 ldi temp,(1<<TOIE0)           ;OCR1A-Int 
180
 sts timsk0,temp               ;freischalten;
181
sei 
182
183
184
185
;
186
187
188
189
;******************************************************************************
190
;      Hauptschleife
191
;******************************************************************************
192
193
194
mainloop:
195
sbi led1_port,led1_bit      ;ein 
196
197
198
199
  rcall sens_0
200
  rcall waiting  ;1sekunde warten
201
  rcall sens_1
202
  rcall waiting  ;1sekunde warten
203
  rcall sens_2
204
  rcall waiting  ;1sekunde warten
205
  rcall sens_3
206
  rcall waiting  ;1sekunde warten
207
  rcall sens_4
208
  rcall waiting  ;1sekunde warten
209
  rcall sens_5
210
  rcall waiting  ;1sekunde warten
211
 rcall sens_6
212
 rcall waiting  ;1sekunde warten
213
  rcall sens_7
214
  rcall waiting  ;1sekunde warten
215
  rcall sens_8
216
  rcall waiting  ;1sekunde warten
217
  rcall sens_9
218
  rcall waiting  ;1sekunde warten
219
220
  rjmp Mainloop
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
sens_0:
238
rcall sensor_0 
239
ret
240
 
241
 
242
sens_1:
243
rcall sensor_1  
244
ret
245
    
246
247
248
sens_2:
249
rcall sensor_2  
250
ret
251
252
253
sens_3:
254
rcall sensor_3  
255
ret
256
257
258
sens_4:
259
rcall sensor_4  
260
ret
261
262
sens_5:
263
rcall sensor_5  
264
ret
265
    
266
267
268
sens_6:
269
rcall sensor_6  
270
ret
271
272
273
sens_7:
274
rcall sensor_7  
275
ret
276
277
278
sens_8:
279
rcall sensor_8  
280
ret
281
282
sens_9:
283
rcall sensor_9  
284
ret
285
286
287
288
289
290
291
292
293
sensor_0:
294
295
  ldi   temp5, 1
296
  ori  temp5,0x30    ;Ergebnis in ASCII wandeln
297
  sts  rsbuff+0,temp5
298
299
300
  rcall reset_pulse;
301
   rcall skip_rom
302
   rcall convert_t
303
  rcall reset_pulse
304
   rcall read_sens1   ;einen sensor mit seiner id direkt ansprechen
305
   rcall read_scratchpad
306
   rcall reset_pulse
307
308
  rcall  berechnung
309
ret
310
311
sensor_1:
312
   ldi   temp5, 2
313
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
314
   sts  rsbuff+0,temp5
315
316
317
   rcall reset_pulse;
318
   rcall skip_rom
319
   rcall convert_t
320
   rcall reset_pulse
321
   rcall read_sens2   ;einen sensor mit seiner id direkt ansprechen
322
   rcall read_scratchpad
323
   rcall reset_pulse
324
  
325
     rcall  berechnung
326
ret
327
328
329
330
sensor_2:
331
   ldi   temp5, 3
332
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
333
   sts  rsbuff+0,temp5
334
335
336
   rcall reset_pulse;
337
   rcall skip_rom
338
   rcall convert_t
339
   rcall reset_pulse
340
   rcall read_sens3   ;einen sensor mit seiner id direkt ansprechen
341
   rcall read_scratchpad
342
   rcall reset_pulse
343
344
   rcall  berechnung
345
ret
346
347
348
349
sensor_3:
350
   ldi   temp5, 4
351
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
352
   sts  rsbuff+0,temp5
353
354
355
   rcall reset_pulse;
356
   rcall skip_rom
357
   rcall convert_t
358
   rcall reset_pulse
359
   rcall read_sens4   ;einen sensor mit seiner id direkt ansprechen
360
   rcall read_scratchpad
361
   rcall reset_pulse
362
   
363
      rcall  berechnung
364
ret
365
366
367
sensor_4:
368
369
   ldi   temp5, 5
370
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
371
   sts  rsbuff+0,temp5
372
373
374
   rcall reset_pulse;
375
   rcall skip_rom
376
   rcall convert_t
377
   rcall reset_pulse
378
   rcall read_sens5   ;einen sensor mit seiner id direkt ansprechen
379
   rcall read_scratchpad
380
   rcall reset_pulse
381
382
   rcall  berechnung
383
ret
384
385
386
387
388
sensor_5:
389
   ldi   temp5, 6
390
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
391
   sts  rsbuff+0,temp5
392
393
394
   rcall reset_pulse;
395
   rcall skip_rom
396
   rcall convert_t
397
   rcall reset_pulse
398
   rcall read_sens6   ;einen sensor mit seiner id direkt ansprechen
399
   rcall read_scratchpad
400
   rcall reset_pulse
401
402
   rcall  berechnung
403
ret
404
405
406
407
sensor_6:
408
   ldi   temp5, 7
409
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
410
   sts  rsbuff+0,temp5
411
412
413
   rcall reset_pulse;
414
   rcall skip_rom
415
   rcall convert_t
416
   rcall reset_pulse
417
   rcall read_sens7   ;einen sensor mit seiner id direkt ansprechen
418
   rcall read_scratchpad
419
   rcall reset_pulse
420
421
   rcall  berechnung
422
ret
423
424
425
426
sensor_7:
427
   ldi   temp5, 8
428
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
429
   sts  rsbuff+0,temp5
430
431
432
   rcall reset_pulse;
433
   rcall skip_rom
434
   rcall convert_t
435
   rcall reset_pulse
436
   rcall read_sens8   ;einen sensor mit seiner id direkt ansprechen
437
   rcall read_scratchpad
438
   rcall reset_pulse
439
440
   rcall  berechnung
441
ret
442
443
444
sensor_8:
445
   ldi   temp5, 9
446
   ori  temp5,0x30    ;Ergebnis in ASCII wandeln
447
   sts  rsbuff+0,temp5
448
449
450
   rcall reset_pulse;
451
   rcall skip_rom
452
   rcall convert_t
453
   rcall reset_pulse
454
   rcall read_sens9   ;einen sensor mit seiner id direkt ansprechen
455
   rcall read_scratchpad
456
   rcall reset_pulse
457
458
   rcall  berechnung
459
ret
460
461
462
463
sensor_9:
464
   ldi   temp5, 'A'
465
   sts  rsbuff+0,temp5
466
467
468
   rcall reset_pulse;
469
   rcall skip_rom
470
   rcall convert_t
471
   rcall reset_pulse
472
   rcall read_sens10   ;einen sensor mit seiner id direkt ansprechen
473
   rcall read_scratchpad
474
   rcall reset_pulse
475
476
   rcall  berechnung
477
ret
478
479
480
;*****************
481
482
483
484
485
;******************************************************************************
486
;******************************************************************************
487
;ds18s20 routinen
488
;******************************************************************************
489
490
reset_pulse:
491
  sbi ddrb, 1        ;pd0 als ausgang
492
  cbi portb, 1  
493
  rcall wait500us        ;mcu hält bus für mindestens 480us low
494
  cbi ddrb, 1        ;lässt den bus los, geht in rx-mode
495
  rcall wait70us        ;wartet 70 us
496
  
497
  wait_presence_pulse:
498
  sbic pinb, 1
499
  rjmp wait_presence_pulse    ;wartet auf presence pulse
500
  
501
  wait_presence_pulse_end:
502
  sbis pinb, 1        
503
  rjmp wait_presence_pulse_end     ;wartet bis presence pulse fertig
504
505
  rcall wait410us        ;wartet 412 us
506
507
ret
508
509
;******************************************************************************
510
511
write_1:          ;schreibt eine 1
512
  
513
  sbi ddrb, 1        ;PB0 Ausgang
514
  cbi portb, 1        ;bus auf low
515
  rcall wait6us        ;wartet 8us (maximum sind 15us)
516
  cbi ddrb, 1        ;lässt bus los, nun durch ext R auf high
517
  rcall wait64us        ;slot muss mind. 60us lang sein
518
  ret
519
520
;******************************************************************************
521
write_0:          ;schreibt eine 0
522
  
523
  sbi ddrb, 1        ;PB0 ausgang
524
  cbi portb, 1      ;bus auf low
525
  rcall wait60us
526
  cbi ddrb, 1        ;lässt bus los, nun durch ext R auf high
527
  rcall wait10us        ;slot muss mind. 60us lang sein
528
529
  ret
530
531
;******************************************************************************
532
write_command:          ;gibt einen befehl aus, lsb zuerst
533
534
  sbrs befehl, 0  
535
  rcall write_0
536
  sbrc befehl, 0
537
  rcall write_1
538
  
539
  ror befehl        ;nächstes bit
540
  ldi temp, 7
541
542
  write_command_1:
543
  sbrs befehl, 0  
544
  rcall write_0
545
  sbrc befehl, 0
546
  rcall write_1
547
  ror befehl
548
  dec temp
549
  brne write_command_1
550
551
ret
552
553
;******************************************************************************
554
skip_rom:          ;gibt den befehl "Skip Rom" an den
555
  ldi temp, 0xCC        ; sensor aus
556
  mov befehl, temp
557
  rcall write_command
558
ret
559
560
;******************************************************************************
561
convert_t:          ;gibt den befehl "Convert T" an den
562
  ldi temp, 0x44        ; sensor aus
563
  mov befehl, temp
564
  rcall write_command      
565
566
  cbi portb, 1
567
  sbi ddrb, 1        ;bus low für 6us
568
  rcall wait6us
569
  cbi ddrb, 1        ;bus loslassen
570
  rcall wait9us        ;nach 9us samplen
571
  convert_t_1:
572
  sbis pinb, 1        ;wartet bis conversion zu ende ist
573
  rjmp convert_t_1
574
  
575
ret
576
577
;******************************************************************************
578
read_scratchpad:        ;gibt den befehl "Read Scratchpad" 
579
  ldi temp, 0xBE        ; an den sensor aus
580
  
581
  mov befehl, temp
582
  rcall write_command
583
584
  rcall read_bit        ;nach dem befehl werden alle 9 byte
585
  sts temp_lsb, temp2    ; geschickt und eingelesen
586
587
  rcall read_bit
588
    sts temp_msb, temp2
589
590
    rcall read_bit
591
  sts TH_reg, temp2
592
  
593
  rcall read_bit
594
  sts TL_reg, temp2
595
  
596
  rcall read_bit
597
  sts res1, temp2
598
  
599
  rcall read_bit
600
  sts res2, temp2
601
  
602
  rcall read_bit
603
  sts count_re, temp2
604
  
605
  rcall read_bit
606
  sts count_pc, temp2
607
  
608
  rcall read_bit
609
  sts crc, temp2
610
611
612
613
614
615
  ret
616
617
618
  ;*****************************************************
619
  read_bit:
620
  ldi temp2, 0        ;temp2 auf 0
621
  ldi temp, 8        ;8mal durchführen
622
623
  read_bit_0:
624
  ror temp2
625
  cbi portb, 1
626
  sbi ddrb, 1        ;bus low für 6us
627
  rcall wait6us
628
  cbi ddrb, 1        ;bus loslassen.
629
  rcall wait9us        ;nach 9us samplen
630
631
  sbis pinb, 1        ;schaut nach ob nun eine 0 anliegt
632
  rjmp read_bit_1        ;wenn ja, springe weiter
633
  ldi temp1, 128
634
;add temp2, r26
635
  add temp2, temp1
636
  rjmp read_bit_2
637
638
  read_bit_1:        
639
  ldi temp1, 0
640
  add temp2, temp1
641
642
  read_bit_2:
643
644
  rcall wait55us
645
  dec temp
646
  brne read_bit_0        ;zum schluss steht das fertige byte in tmp3
647
ret
648
649
650
651
652
;;ROM-ID auslesen
653
654
rom_id:
655
  ldi temp,  0x33        ;READ_ROM
656
  mov befehl, temp
657
  rcall write_command
658
659
  rcall read_bit        ;nach dem befehl werden alle 9 byte
660
  sts id_rom+0, temp2    ; geschickt und eingelesen
661
662
  rcall read_bit
663
  sts id_rom+1, temp2
664
665
  rcall read_bit
666
  sts id_rom+2, temp2
667
  
668
  rcall read_bit
669
  sts id_rom+3, temp2
670
  
671
  rcall read_bit
672
  sts id_rom+4, temp2
673
  
674
  rcall read_bit
675
  sts id_rom+5, temp2
676
  
677
  rcall read_bit
678
  sts id_rom+6, temp2
679
  
680
  rcall read_bit
681
  sts id_rom+7, temp2
682
683
684
685
ret
686
687
688
689
read_sens1:                         ; an den sensor aus
690
  
691
;******************************************************************************
692
           ldi ZL, LOW(ID_Tabelle1*2)         
693
           ldi ZH, HIGH(ID_Tabelle1*2)        
694
695
  ldi temp, 0x55        ; MATCH-ROM
696
  mov befehl, temp
697
  rcall write_command
698
699
700
       ldi    temp4,8     ;8 Byte ausgeben
701
loop:  lpm    befehl,Z+   ;Byte aus Flash holen
702
       rcall  write_command
703
       dec    temp4
704
       brne   loop
705
706
;;EINEN Sensor auslesen
707
;  ldi temp, 0x55        ; MATCH-ROM
708
;  mov befehl, temp
709
;  rcall write_command
710
711
;  lds befehl,id_rom+0
712
;  rcall write_command
713
;  lds befehl,id_rom+1
714
;  rcall write_command
715
;  lds befehl,id_rom+2
716
;  rcall write_command
717
;  lds befehl,id_rom+3
718
;  rcall write_command
719
;  lds befehl,id_rom+4
720
;  rcall write_command
721
;  lds befehl,id_rom+5
722
;  rcall write_command
723
;  lds befehl,id_rom+6
724
;  rcall write_command
725
;  lds befehl,id_rom+7
726
;  rcall write_command
727
728
  
729
730
ret
731
732
733
read_sens2:                         ; an den sensor aus
734
  
735
;******************************************************************************
736
           ldi ZL, LOW(ID_Tabelle2*2)         
737
           ldi ZH, HIGH(ID_Tabelle2*2)        
738
739
  ldi temp, 0x55        ; MATCH-ROM
740
  mov befehl, temp
741
  rcall write_command
742
743
744
       ldi    temp4,8     ;8 Byte ausgeben
745
lop:  lpm    befehl,Z+   ;Byte aus Flash holen
746
       rcall  write_command
747
       dec    temp4
748
       brne   lop
749
750
751
ret    
752
753
read_sens3:                         ; an den sensor aus
754
  
755
;******************************************************************************
756
           ldi ZL, LOW(ID_Tabelle3*2)         
757
           ldi ZH, HIGH(ID_Tabelle3*2)        
758
759
  ldi temp, 0x55        ; MATCH-ROM
760
  mov befehl, temp
761
  rcall write_command
762
763
764
       ldi    temp4,8     ;8 Byte ausgeben
765
lop3:  lpm    befehl,Z+   ;Byte aus Flash holen
766
       rcall  write_command
767
       dec    temp4
768
       brne   lop3
769
770
771
  
772
773
ret    
774
775
776
777
778
779
read_sens4:                         ; an den sensor aus
780
  
781
;******************************************************************************
782
           ldi ZL, LOW(ID_Tabelle4*2)         
783
           ldi ZH, HIGH(ID_Tabelle4*2)        
784
785
  ldi temp, 0x55        ; MATCH-ROM
786
  mov befehl, temp
787
  rcall write_command
788
789
790
       ldi    temp4,8     ;8 Byte ausgeben
791
lop4:  lpm    befehl,Z+   ;Byte aus Flash holen
792
       rcall  write_command
793
       dec    temp4
794
       brne   lop4
795
796
797
  
798
799
ret    
800
801
802
read_sens5:                         ; an den sensor aus
803
  
804
;******************************************************************************
805
           ldi ZL, LOW(ID_Tabelle5*2)         
806
           ldi ZH, HIGH(ID_Tabelle5*2)        
807
808
  ldi temp, 0x55        ; MATCH-ROM
809
  mov befehl, temp
810
  rcall write_command
811
812
813
       ldi    temp4,8     ;8 Byte ausgeben
814
lop5:  lpm    befehl,Z+   ;Byte aus Flash holen
815
       rcall  write_command
816
       dec    temp4
817
       brne   lop5
818
819
  
820
821
ret    
822
823
824
825
read_sens6:                         ; an den sensor aus
826
  
827
;******************************************************************************
828
           ldi ZL, LOW(ID_Tabelle6*2)         
829
           ldi ZH, HIGH(ID_Tabelle6*2)        
830
831
  ldi temp, 0x55        ; MATCH-ROM
832
  mov befehl, temp
833
  rcall write_command
834
835
836
       ldi    temp4,8     ;8 Byte ausgeben
837
lop6:  lpm    befehl,Z+   ;Byte aus Flash holen
838
       rcall  write_command
839
       dec    temp4
840
       brne   lop6
841
842
  
843
844
ret    
845
846
847
848
849
read_sens7:                         ; an den sensor aus
850
  
851
;******************************************************************************
852
           ldi ZL, LOW(ID_Tabelle7*2)         
853
           ldi ZH, HIGH(ID_Tabelle7*2)        
854
855
  ldi temp, 0x55        ; MATCH-ROM
856
  mov befehl, temp
857
  rcall write_command
858
859
860
       ldi    temp4,8     ;8 Byte ausgeben
861
lop7:  lpm    befehl,Z+   ;Byte aus Flash holen
862
       rcall  write_command
863
       dec    temp4
864
       brne   lop7
865
866
  
867
868
ret    
869
870
871
872
read_sens8:                         ; an den sensor aus
873
  
874
;******************************************************************************
875
           ldi ZL, LOW(ID_Tabelle8*2)         
876
           ldi ZH, HIGH(ID_Tabelle8*2)        
877
878
  ldi temp, 0x55        ; MATCH-ROM
879
  mov befehl, temp
880
  rcall write_command
881
882
883
       ldi    temp4,8     ;8 Byte ausgeben
884
lop8:  lpm    befehl,Z+   ;Byte aus Flash holen
885
       rcall  write_command
886
       dec    temp4
887
       brne   lop8
888
889
  
890
891
ret    
892
893
894
895
896
read_sens9:                         ; an den sensor aus
897
  
898
;******************************************************************************
899
           ldi ZL, LOW(ID_Tabelle9*2)         
900
           ldi ZH, HIGH(ID_Tabelle9*2)        
901
902
  ldi temp, 0x55        ; MATCH-ROM
903
  mov befehl, temp
904
  rcall write_command
905
906
907
       ldi    temp4,8     ;8 Byte ausgeben
908
lop9:  lpm    befehl,Z+   ;Byte aus Flash holen
909
       rcall  write_command
910
       dec    temp4
911
       brne   lop9
912
913
  
914
915
ret    
916
917
918
read_sens10:                         ; an den sensor aus
919
  
920
;******************************************************************************
921
           ldi ZL, LOW(ID_Tabelle10*2)         
922
           ldi ZH, HIGH(ID_Tabelle10*2)        
923
924
  ldi temp, 0x55        ; MATCH-ROM
925
  mov befehl, temp
926
  rcall write_command
927
928
929
       ldi    temp4,8     ;8 Byte ausgeben
930
lop10:  lpm    befehl,Z+   ;Byte aus Flash holen
931
       rcall  write_command
932
       dec    temp4
933
       brne   lop10
934
935
  
936
937
ret    
938
939
940
941
942
943
944
945
946
947
948
949
SEND:
950
951
ma1400:  
952
953
954
955
    ldi  xl,low(rsbuff)
956
  ldi  xh,high(rsbuff)    ;Zeiger auf RS232-Puffer
957
  ldi  temp3,6      ;7 Zeichen senden
958
ma1410:  
959
    ld  dta,x+      ;Zeichen holen
960
  rcall  uart_tx      ;Zeichen senden
961
  dec  temp3      ;alle Zeichen gesendet?
962
  brne  ma1410      ;nein -> Schleife
963
964
RET
965
966
967
968
969
uart_tx:
970
  lds buffer,ucsr0a
971
  sbrs buffer,UDRe0
972
  rjmp uart_tx
973
  sts UDR0,dta   
974
ret 
975
  
976
977
978
979
980
981
982
983
984
985
986
wait500us:
987
; ============================= 
988
;   Warteschleifen-Generator 
989
;     3686 Zyklen:
990
; ----------------------------- 
991
; warte 3675 Zyklen:
992
          ldi  R20, $05
993
WGLOOP0:  ldi  R22, $F4
994
WGLOOP1:  dec  R22
995
          brne WGLOOP1
996
          dec  R20
997
          brne WGLOOP0
998
;----------------------------- 
999
; warte 9 Zyklen:
1000
          ldi  R20, $03
1001
WGLOOP2:  dec  R20
1002
          brne WGLOOP2
1003
; ----------------------------- 
1004
; warte 2 Zyklen:
1005
          nop
1006
          nop
1007
; ============================= 
1008
1009
1010
1011
  ret
1012
;******************************************************************************
1013
wait410us:
1014
; ============================= 
1015
;   Warteschleifen-Generator 
1016
;     3023 Zyklen:
1017
; ----------------------------- 
1018
; warte 3021 Zyklen:
1019
          ldi  R20, $13
1020
WGLOOP0410:  ldi  R22, $34
1021
WGLOOP1410:  dec  R22
1022
          brne WGLOOP1410
1023
          dec  R20
1024
          brne WGLOOP0410
1025
; ----------------------------- 
1026
; warte 2 Zyklen:
1027
          nop
1028
          nop
1029
; ============================= 
1030
1031
1032
1033
1034
  ret
1035
;******************************************************************************
1036
wait70us:
1037
; ============================= 
1038
;   Warteschleifen-Generator 
1039
;     516 Zyklen:
1040
; ----------------------------- 
1041
; warte 516 Zyklen:
1042
          ldi  R20, $AC
1043
WGLOOP070:  dec  R20
1044
          brne WGLOOP070
1045
; ============================= 
1046
1047
1048
  
1049
  ret
1050
;******************************************************************************
1051
wait64us:
1052
; ============================= 
1053
;   Warteschleifen-Generator 
1054
;     472 Zyklen:
1055
; ----------------------------- 
1056
; warte 471 Zyklen:
1057
          ldi  R20, $9D
1058
WGLOOP064:  dec  R20
1059
          brne WGLOOP064
1060
; ----------------------------- 
1061
; warte 1 Zyklus:
1062
          nop
1063
; ============================= 
1064
1065
1066
  ret
1067
;******************************************************************************
1068
wait60us:
1069
; ============================= 
1070
;   Warteschleifen-Generator 
1071
;     442 Zyklen:
1072
; ----------------------------- 
1073
; warte 441 Zyklen:
1074
          ldi  R20, $93
1075
WGLOOP060:  dec  R20
1076
          brne WGLOOP060
1077
; ----------------------------- 
1078
; warte 1 Zyklus:
1079
          nop
1080
; ============================= 
1081
1082
 
1083
  ret
1084
;******************************************************************************
1085
wait55us:
1086
; ============================= 
1087
;   Warteschleifen-Generator 
1088
;     406 Zyklen:
1089
; ----------------------------- 
1090
; warte 405 Zyklen:
1091
          ldi  R20, $87
1092
WGLOOP055:  dec  R20
1093
          brne WGLOOP055
1094
; ----------------------------- 
1095
; warte 1 Zyklus:
1096
          nop
1097
; ============================= 
1098
1099
1100
1101
  ret
1102
;******************************************************************************
1103
wait10us:
1104
; ============================= 
1105
;   Warteschleifen-Generator 
1106
;     74 Zyklen:
1107
; ----------------------------- 
1108
; warte 72 Zyklen:
1109
          ldi  R20, $18
1110
WGLOOP010:  dec  R20
1111
          brne WGLOOP010
1112
; ----------------------------- 
1113
; warte 2 Zyklen:
1114
          nop
1115
          nop
1116
; ============================= 
1117
 
1118
1119
1120
1121
  ret
1122
1123
;******************************************************************************
1124
wait9us:
1125
; ============================= 
1126
;   Warteschleifen-Generator 
1127
;     66 Zyklen:
1128
; ----------------------------- 
1129
; warte 66 Zyklen:
1130
          ldi  R20, $16
1131
WGLOOP09:  dec  R20
1132
          brne WGLOOP09
1133
; ============================= 
1134
1135
1136
  ret
1137
;******************************************************************************
1138
1139
1140
wait6us:
1141
; ============================= 
1142
;   Warteschleifen-Generator 
1143
;     44 Zyklen:
1144
; ----------------------------- 
1145
; warte 42 Zyklen:
1146
          ldi  R20, $0E
1147
WGLOOP06:  dec  R20
1148
          brne WGLOOP06
1149
; ----------------------------- 
1150
; warte 2 Zyklen:
1151
          nop
1152
          nop
1153
; ============================= 
1154
1155
1156
  ret
1157
;******************************************************************************
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
berechnung:
1168
; DS1820/DS18S20/DS1920: Gelesene Daten aufbereiten, Erhöhung der Mess-
1169
; Genauigkeit durch Algorithmus nach Datenblatt; die Formel wurde etwas
1170
; modifiziert, so dass mit ganzzahligen Werten gerechnet werden kann
1171
; und keine Divisionsroutine nötig ist:
1172
; Temp = (160 * Temp_Read - 40 + 10*(Count_Per_C - Count_Remain)) / 16
1173
; Das Ergebnis liegt dann in Zehntel Grad vor.
1174
;
1175
ma1200:
1176
  lds  r17,temp_msb    ;Temperaturwert H holen
1177
  lds  r16,temp_lsb    ;Temperaturwert L holen
1178
  ror  r17
1179
  ror  r16      ;LSB abschneiden (Temp_Read)
1180
  ldi  r17,160      ;Wert für höhere Genauigkeit
1181
  mulsu  r16,r17      ;mit 160 multiplizieren
1182
  movw  xl,r0      ;Ergebnis kopieren
1183
  sbiw  xl,40      ;40 subtrahieren
1184
  ldi  r16,16      ;Count_Per_C laden (immer 16)
1185
  lds  r17,count_re    ;Count_Remain holen
1186
  sub  r16,r17      ;Count_Per_C - Count_Remain
1187
  add  r16,r16      ;Wert *2
1188
  mov  r17,r16      ;kopieren
1189
  add  r16,r16      ;Wert nochmals *2 (*4)
1190
  add  r16,r16      ;Wert nochmals *2 (*8)
1191
  add  r16,r17      ;*2-Wert addieren (*10)
1192
  clr  r17      ;H-Byte=0
1193
  add  xl,r16      ;zur vorherigen Rechnung add.
1194
  adc  xh,r17      ;Übertrag addieren
1195
  asr  xh
1196
  ror  xl      ;Wert /2
1197
  asr  xh
1198
  ror  xl      ;Wert /2 (/4)
1199
  asr  xh
1200
  ror  xl      ;Wert /2 (/8)
1201
  asr  xh
1202
  ror  xl      ;Wert /2 (/16)
1203
  brcc  ma1210      ;runden? nein -> weiter
1204
  adiw  xl,1      ;sonst Ergebnis aufrunden
1205
ma1210:
1206
  mov  r20,xh      ;Vorzeichen sichern
1207
  bst  xh,7      ;Ergebnis negativ?
1208
  brtc  ma1300      ;nein -> überspringen
1209
  clr  r16      ;Wert 0x10000 zur Wandlung ins
1210
  clr  r17      ;Zweierkomplement laden
1211
  sub  r16,xl      ;L subtrahieren
1212
  sbc  r17,xh      ;H mit Übertrag subtrahieren
1213
  movw  xl,r16      ;ins Ergebnis-Register kopieren
1214
  rjmp  ma1300      ;in ASCII wandeln
1215
;
1216
1217
; Ergebnis in Dezimal-ASCII umwandeln
1218
;
1219
ma1300:  
1220
 clr  r16      ;0-Wert für 16-Bit Subtraktion
1221
  clr  r18      ;ASCII Stelle 2 löschen
1222
  clr  r19      ;ASCII Stelle 1 löschen
1223
ma1310:
1224
 mov  r17,xl      ;Binärzahl zwischenspeichern L
1225
  subi  xl,100      ;100 subtrahieren
1226
  sbc  xh,r16      ;Übertrag subtrahieren
1227
  brcs  ma1320      ;war Zahl>99? nein -> weiter
1228
  inc  r18      ;ASCII Stelle 2 erhöhen
1229
  cpi  r18,10      ;Übertrag?
1230
  brcs  ma1310      ;nein -> Schleife
1231
  clr  r18      ;sonst ASCII Stelle 2 löschen
1232
  inc  r19      ;und ASCII Stelle 1 erhöhen
1233
  rjmp  ma1310      ;Schleife
1234
;
1235
ma1320:  
1236
 mov  xl,r17      ;letzten Binärwert L holen
1237
  clr  r17      ;ASCII Stelle 3 löschen
1238
ma1330:  
1239
 cpi  xl,10      ;Wert>9?
1240
  brcs  ma1340      ;nein -> Rest auswerten
1241
  inc  r17      ;sonst ASCII Stelle 3 erhöhen
1242
  subi  xl,10      ;Wert um 10 vermindern
1243
  rjmp  ma1330      ;Schleife
1244
ma1340:
1245
 mov  r16,xl      ;Rest in ASCII Stelle 4 legen
1246
  ori  r16,0x30    ;Ergebnis in ASCII wandeln
1247
  ori  r17,0x30
1248
  ori  r18,0x30
1249
  ori  r19,0x30
1250
;
1251
    
1252
  sts  rsbuff+2,r18
1253
  sts  rsbuff+3,r17
1254
 ldi  r19,'.'  
1255
 sts  rsbuff+4,r19
1256
  sts  rsbuff+5,r16
1257
1258
1259
ma1350:  bst  r20,7      ;ist Temperaturwert negativ?
1260
  brtc  ma1375      ;nein -> überspringen
1261
  ldi  r19,'-'      ;
1262
ma1370:  
1263
sts  rsbuff+1,r19
1264
RJMP HJK
1265
ma1375:
1266
ldi  r19,'+'  
1267
sts  rsbuff+1,r19
1268
1269
HJK:
1270
1271
MNHZ:
1272
 RCALL SEND
1273
 ldi   dta, 13
1274
 RCALL uart_tx
1275
ret
1276
1277
1278
1279
1280
1281
1282
WARTEN:
1283
; ============================= 
1284
;   Warteschleifen-Generator 
1285
;     20000000 Zyklen:
1286
; ----------------------------- 
1287
; warte 19999992 Zyklen:
1288
          ldi  R20, $BF
1289
WGLOOAP0:  ldi  R22, $A7
1290
WGLOOAP1:  ldi  R23, $D0
1291
WGLOOAP2:  dec  R23
1292
          brne WGLOOAP2
1293
          dec  R22
1294
          brne WGLOOAP1
1295
          dec  R20
1296
          brne WGLOOAP0
1297
; ----------------------------- 
1298
; warte 6 Zyklen:
1299
          ldi  R20, $02
1300
WGLOOAP3:  dec  R20
1301
          brne WGLOOAP3
1302
; ----------------------------- 
1303
; warte 2 Zyklen:
1304
          nop
1305
          nop
1306
; ============================= 
1307
1308
; ============================= 
1309
1310
1311
1312
RET
1313
1314
waiting:
1315
; ============================= 
1316
;   Warteschleifen-Generator 
1317
1318
; ----------------------------- 
1319
; warte 7372782 Zyklen:
1320
          ldi  R20, $36
1321
WwGLOOP0:  ldi  R22, $B9
1322
WwGLOOP1:  ldi  R23, $F5
1323
WwGLOOP2:  dec  R23
1324
          brne WwGLOOP2
1325
          dec  R22
1326
          brne WwGLOOP1
1327
          dec  R20
1328
          brne WwGLOOP0
1329
; ----------------------------- 
1330
; warte 18 Zyklen:
1331
          ldi  R20, $06
1332
WwGLOOP3:  dec  R20
1333
          brne WwGLOOP3
1334
; ============================= 
1335
1336
1337
ret
1338
1339
1340
;******************************************************************************
1341
;******************************************************************************
1342
TIM0_OVF:
1343
in srsk, sreg
1344
push xh
1345
push xl
1346
1347
 lds  xl,tim0z_1                          ;Int-Zähler1 holen
1348
 sbi onled_port,onled_bit              ;einschalten
1349
  cpi  xl,25                                ;Zählerstand<9?
1350
  brcs  t2c100                              ;ja -> LED1-Zustand ok
1351
 cbi onled_port,onled_bit              ;ausschalten
1352
  cpi  xl,75                              ;Zählerstand<9?
1353
  brcs  t2c100                              ;ja -> LED1-Zustand ok
1354
 sbi onled_port,onled_bit              ;einschalten
1355
;
1356
t2c100:
1357
;Int-Zähler1
1358
t2_z:
1359
  lds  xl,tim0z_1       ;Int-Zähler1 holen
1360
  inc  xl                ;erhöhen
1361
  sts  tim0z_1,xl       ;und wieder speichern
1362
  cpi  xl,255            ;Endwert erreicht?
1363
  brcc  t2_z1510         ;ja -> weiter
1364
  rjmp  t2_z1end         ;sonst Ende
1365
1366
t2_z1510:
1367
  clr  xl                ;Int-Zähler1 löschen
1368
  sts  tim0z_1,xl       ;und wieder speichern;
1369
1370
t2_z1end:
1371
 pop xl
1372
 pop xh
1373
  out sreg, srsk
1374
reti
1375
1376
1377
1378
1379
1380
1381
1382
ID_Tabelle1:
1383
.db  16,136,190,113,1,8,0,167
1384
1385
1386
ID_Tabelle2:
1387
.db  16,152,46,113,1,8,0,75
1388
1389
1390
ID_Tabelle3:
1391
.db  16,37,74,113,1,8,0,8
1392
1393
ID_Tabelle4:
1394
.db  16,215,97,113,1,8,0,156
1395
1396
ID_Tabelle5:
1397
.db  16,86,244,113,1,8,0,36
1398
1399
1400
ID_Tabelle6:
1401
1402
.db  16,51,94,123,1,8,0,153
1403
1404
ID_Tabelle7:
1405
.db  16,170,84,123,1,8,0,3
1406
1407
ID_Tabelle8:
1408
.db  16,7,41,123,1,8,0,148
1409
1410
ID_Tabelle9:
1411
.db  16,185,42,123,1,8,0,206
1412
1413
ID_Tabelle10:
1414
.db  16,0,66,123,1,8,0,112