Code:
#include <avr/io.h>
#include "def_asm.h"
.section .text
.global asm_main
asm_main:
;Baudrate 2400
ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1
ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1
init:
;Baudrate 2400
ldi temp1,hi8(BAUDRATE)
out IO_REG(UBRR0H), temp1
ldi temp1,lo8(BAUDRATE)
out IO_REG(UBRR0L),temp1
ldi temp1, (1<<RXEN0) | (1<<TXEN0)
out IO_REG(UCSR0B), temp1
;Timer 2 für IR-CLK
ldi temp1, (1<<WGM21) | (1<<COM2A0) // 36khz ir-clk mit timer2
out IO_REG(TCCR2A), temp1
ldi temp1, (1<<CS21)
out IO_REG(TCCR2B),temp1
ldi temp1, 0x22
out IO_REG(OCR2A), temp1
;Dioden Status-LED IR-LED Front-LED
ldi temp1, (1<<PB3) | (1<<PB0)
out DDRB, temp1 // ir-led-driver und status-led1
ldi temp1, (1<<PD2) // status-led2
out DDRD, temp1
ldi temp1, (1<<PD6)
out DDRD, temp1 // rote front-led für batterie
; batt test5 init
;ADC Enable und ADC Prescaler auf 128
ldi temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) // adc-clk = sys-clk/128
out IO_REG(ADCSRA), temp1
;Reference Spannung auf Interne 2,56 Volt setzen und ADC5 als Input pin
ldi temp1, (1<<REFS0) | (1<<REFS1) | (1<<MUX2) | (1<<MUX0);
out IO_REG(ADMUX), temp1
ret
rcall init // init com-port-verbindung mit 2400 baud
ldi ZL, lo8(wait_send); // startstring senden
ldi ZH, hi8(wait_send);
rcall com_put_string // startstring senden
main_loop:
;Batt test
sbi IO_REG(ADCSRA), ADSC
batt_loop:
sbic IO_REG(ADCSRA), ADSC
rjmp batt_loop
clc
in INT_REG_L, ADCL
in INT_REG_H, ADCH
subi INT_REG_L, lo8(BATT_MIN)
sbci INT_REG_H, hi8(BATT_MIN)
brcc batt_ok
// versorgungs-spannung zu gering
sbi IO_REG(PORTD), PD6
rjmp ende
batt_ok:
;schleifen kopf
LDI r19,255
verzoeg111:
LDI r18,255
verzoeg11:
LDI r17,255
verzoeg1:
// Was da ?
rcall wait_serial // warte auf ein zeichen vom com-port
cpi CHAR_GET_REG, STARTZEICHEN // war es das startzeichen?
breq start_rec // ja, dann startet die datenübertragung
;Schleifen Fuß
DEC r17
BRNE verzoeg1
DEC r18
BRNE verzoeg11
DEC r19
BRNE verzoeg111
rjmp start_prog
// Speichern
start_rec:
sbi IO_REG(PORTB), PB0 // led on IR-Diode
sbi IO_REG(PORTD), PD2 // led on Status
clr temp1
sts page_adr, temp1 // flash-page-adress mit 0 initialisieren
sts page_adr+1, temp1 // programm wird immer ab adresse 0 gespeichert
rcall flash_get // flashdaten einlesen
cbi IO_REG(PORTB), PB0 // led off
cbi IO_REG(PORTD), PD2 // led off
sbi IO_REG(PORTD), PD6 // led on
rcall wait_serial // wartezeit eine sekunde
cbi IO_REG(PORTD), PD6 // led off
ldi ZL, lo8(flash_ok); // startstring senden
ldi ZH, hi8(flash_ok);
rcall com_put_string // startstring senden
start_prog:
clr ZL // adresse 0 = reset vector
clr ZH
ijmp // indirect jump zum reset vector
*** END ***
ende:
rjmp ende
def_asm.h:
Lesezeichen