;-------------------------------------------------------------------- ; ; set_cren.asm ; ; Setzt auf dem 2-Prozessor-Board das RCEN-Fuse-Bit des ; Slave Prozessors. Das geht nur im Parallel-Programmier-Modus. ; Der Port B ist dazu 1 zu 1 mit dem Port B des Slaves verbunden. ; (Master ist der AVR auf dem diese Software läuft, Slave ist der ; zweite AVR dessen RCEN Bit gesetzt wird). ; ; Insgesammt gilt folgendes Bit Mapping: ; ; Master Slave Bemerkung ; Port B Port B alle 8 Bit 1 zu 1 verbunden ; PD 1 XTAL1 Quarzosz. Eingang des Slaves ; PD 3 PD 3 WR Pin für Parallelprog. ; PD 5 PD 5 XA0 Pin für Parallelprog. ; PD 6 PD 6 XA1 Pin für Parallelprog. ; ;-------------------------------------------------------------------- .include "1200def.inc" ; Target ist ein 1200er .def temp = r16 ; Universalvariable für dies und das .def pa = r17 ; Einstellregister für die Wartezeit bei Pause ; ------ Bitdefinitionen für Port D ------ .equ XA0 = 5 ; .equ XA1 = 6 .equ WR = 3 .equ XTAL1 = 1 .equ prg12v = 0 ; +12V für Parallelprog wird von PD0 angest. ;---------------- Ports auf Ausgang schalten ------------------------ ser temp out DDRB, temp out DDRD, temp ;---------------- los gehts ----------------------------------------- ;Vcc einschwingen lassen ldi pa, 255 rcall pause ;Startkonfiguration setzen cbi PORTD, XA0 ; XA0, XA1 und XTAL auf 0 vorsetzen cbi PORTD, XA1 cbi PORTD, XTAL1 sbi PORTD, WR ; WR ist aktiv low, deshalb mit 1 vorsetzen cbi PORTD, prg12v ; Reset des Slaves auf 0 setzen clr temp ; PORT B auf 0 vorsetzen out PORTB, temp ;Der Reset der am Slave jetzt anliegt muß min. 100ns bestehen ;bevor die 12V angelegt werden dürfen ldi pa, 255 rcall pause ;Parallelprog Modus aktivieren, dazu Reset auf 12V legen und ;min. 100ns warten (BS muß dabei auf 0 liegen aber das ist in ;der benutzten Hardware eh auf GND hart verdrahtet sbi PORTD, prg12v ; 12V anlegen ldi pa, 255 ; warten rcall pause ;auf gehts mit den einzelnen Schritten sbi PORTD, XA1 ; XA1 XA0 auf 10 setzen ; (Enable Command loading) ldi pa, 255 rcall pause ldi temp, 0b01000000 ; 01000000 am Datenport anlegen out PORTB, temp ldi pa, 255 rcall pause sbi PORTD, XTAL1 ; positiven Puls auf XTAL1 ausgeben cbi PORTD, XTAL1 ldi pa, 255 rcall pause cbi PORTD, XA1 ; XA1 XA0 auf 01 setzen sbi PORTD, XA0 ; (enable data loading) ldi pa, 255 rcall pause ldi temp, 0b11011110 ; 1111 1110 als Daten anlegen ; RCEN Fuse ist Bit0 (0=RC Osziallator aktiviert) ; Achtung: Bit5 ist Serial-programing-enabled SPIEN ; und muß programmiert bleiben, d.h auf 0 !!! out PORTB, temp ; Daten rausschreiben ldi pa, 255 rcall pause sbi PORTD, XTAL1 ; positiven Puls auf XTAL1 ausgeben cbi PORTD, XTAL1 ldi pa, 255 rcall pause cbi PORTD, WR ; Schreibvorgang starten durch WR auf 0 ldi pa, 26 rcall pause ; für 1.5 ms warten sbi PORTD, WR ldi pa, 255 rcall pause cbi PORTD, prg12v ; 12V Programmierspannung vom Reset wieder weg fertig: rjmp fertig ;-------------------------- pause -------------------------------------------- ; abhängig vom Inhalt von reg. pa wird entspr. lange gewartet ; einmal pa entspricht einmal überlaufen des 8-Bit Timers mit ; einem Vorteiler von 1, d.h. t= (1/fq) * 1 * 256 ; (der Master läuft auf einen 4.433 MHz Quarz) pause: pa_loop: ; Vorteiler für den Timer auf 1 setzen ldi temp, 0b00000001 out tccr0, temp ; das Überlaufbit des Counters zurücksetzen, in temp, tifr sbr temp, exp2(tov0) out tifr, temp ; Den Zähler mit Null vorsetzen clr temp out tcnt0, temp ; wenn tcnt0 überläuft wird tov0 gesetzt cwait: in temp, tifr sbrs temp, tov0 rjmp cwait dec pa ; jetzt ist der Timer einmal übergelaufen, brne pa_loop ; pa runterzählen, wenn noch nicht auf 0 ; dann nochmal hoch und den Timer neu aufziehen ret