;----------------------------------------------------------- ; titre : interface pour robot ; version : 1.0 ; cible : at90s1200(a) ; quartz : 4mhz ou internal osc. ; auteur : yann leidwanger ; email : tech@jls-info.com ;----------------------------------------------------------- ;----------------------------------------------------------- ;- registres et equivalences at90s1200 - ;----------------------------------------------------------- .include "1200def.inc" ;----------------------------------------------------------- ;- equivalences - ;----------------------------------------------------------- .def temp = r16 ;registre general #1 .def temp2 = r17 ;registre general #2 .def tempo1 = r18 ;registres tempo .def tempo2 = r19 .def tempo3 = r20 .def buzz1 = r21 ;registres buzzer .def buzz2 = r22 .def buzz3 = r23 ;----------------------------------------------------------- ;- segments - ;----------------------------------------------------------- .cseg ;code segment .org $0000 ;adresse vecteur reset rjmp reset ;saut vecteur reset ;----------------------------------------------------------- ;- routines - ;----------------------------------------------------------- .org $000D ;adresse debut de code ;----------------------------------------------------------- ;- initialisation - ;----------------------------------------------------------- init: ser temp ;port b en sortie out ddrb,temp clr temp ;port d en entree out ddrd,temp sbi portb,pb5 ;desactive buzzer rcall led_dg_off ;led d +g eteintes ret ;----------------------------------------------------------- ;- tempo - ;----------------------------------------------------------- delay: ldi tempo1,$03 loop_t1: ldi tempo2,$ff loop_t2: ldi tempo3,$ff loop_t3: dec tempo3 ;decremente boucle 1 brne loop_t3 ;teste si termine dec tempo2 ;decremente boucle 2 brne loop_t2 ;teste si termine dec tempo1 ;decremente boucle 1 brne loop_t1 ;teste si termine ret ;retour ;----------------------------------------------------------- ;- commandes leds d et g - ;----------------------------------------------------------- led_d_on: cbi portb,pb6 ;led d allumee ret ;retour led_g_on: cbi portb,pb7 ;led g allumee ret ;retour led_dg_on: in temp,portb ;lecture port b andi temp,$3f ;led d + g allumees out portb,temp ;ecriture port b ret ;retour led_d_off: sbi portb,pb6 ;led d eteinte ret ;retour led_g_off: sbi portb,pb7 ;led g eteinte ret ;retour led_dg_off: in temp,portb ;lecture port b ori temp,$c0 ;led d + g eteintes out portb,temp ;ecriture port b ret ;retour ;----------------------------------------------------------- ;- toggle leds d et g - ;----------------------------------------------------------- toggle_leds: rcall led_dg_on ;allumage d + g rcall delay ;attente rcall led_dg_off ;extinction d + g rcall delay ;attente ret ;retour ;----------------------------------------------------------- ;- gestion buzzer #1 - ;- buzzer a,b,c - ;- a : temps etat haut - ;- b : temps etat bas - ;- c : nbre de boucles (a+b) - ;- $20,$20,$ff - ;- $50,$50,$ff - ;- $80,$80,$ff - ;- $ff,$ff,$ff - ;----------------------------------------------------------- .macro buzzer ldi buzz3,@2 ;charge nbre boucles loop_b3: ldi buzz1,@0 ;charge temps bas cbi portb,5 ;active buzzer loop_b2: dec buzz1 ;decremente boucle 1 nop ;attente brne loop_b2 ;teste si termine sbi portb,5 ;desactive buzzer ldi buzz2,@1 ;charge temps haut loop_b1: dec buzz2 ;decremente boucle 2 nop ;attente brne loop_b1 ;teste si termine dec buzz3 ;decremente boucle 3 brne loop_b3 ;teste si termine .endmacro ;----------------------------------------------------------- ;- teste la lumiere ambiante - ;- fin si lumiere suffisante - ;----------------------------------------------------------- test_lum: in temp,pind ;charge port d andi temp,$0c ;isole bits ldr d + g brne buz_low ;teste si ldrs pas eclairees rcall m_on ;mise en route moteurs ret ;si non retour buz_low: rcall m_off ;arret moteurs buzzer $20,$ff,$7f ;son grave rcall delay ;delai rjmp test_lum ;continue ;----------------------------------------------------------- ;- commande des moteurs - ;----------------------------------------------------------- m_d_av: cbi portb,pb3 ;marche avant d sbi portb,pb2 ret m_d_ar: sbi portb,pb3 ;marche arriere d cbi portb,pb2 ret m_g_av: cbi portb,pb0 ;marche avant g sbi portb,pb1 ret m_g_ar: sbi portb,pb0 ;marche arriere g cbi portb,pb1 ret m_on: sbi portb,pb4 ;marche des moteurs ret m_off: cbi portb,pb4 ;arret des moteurs ret ;----------------------------------------------------------- ;- programme principal - ;----------------------------------------------------------- reset: rcall init ;initialisation systeme rcall delay ;attente pour laisser rcall delay ;le robot libre main: rcall m_d_av ;marche avant d rcall m_g_av ;marche avant g rcall m_on ;marche des moteurs main2: rcall test_lum ;verifie lumiere ambiante sbis pind,4 ;swg appuye ? rjmp detour_sw ;si oui detour sbis pind,5 ;swd appuye ? rjmp detour_sw ;si oui detour sbis pind,0 ;irg actif ? rjmp detour_ir ;si oui detour sbis pind,1 ;ird actif ? rjmp detour_ir ;si oui detour rjmp main ;continue detour_sw: rcall m_off ;arret moteurs ldi temp2,$02 ;charge nombre de boucles loop1: buzzer $10,$50,$7f ;son aigu rcall delay ;delai dec temp2 ;decremente nombre de boucles brne loop1 ;teste si termine in temp,pind rcall m_d_ar ;marche arriere d rcall m_g_ar ;marche arriere g rcall m_on ;activation des moteurs ldi temp2,$08 ;charge nombre de boucles loop2: rcall delay ;delai dec temp2 ;decremente nombre de boucles brne loop2 ;teste si termine rcall m_off ;arret moteurs sbrs temp,4 ;swg appuye ? rjmp virage_sw_d ;si oui virage droite sbrs temp,5 ;swd appuye ? rjmp virage_sw_g ;si oui virage gauche virage_sw_d: rcall m_d_ar ;moteur d arriere rcall m_g_av ;moteur g avant rjmp fin_virage_sw ;termine virage_sw_g: rcall m_d_av ;moteur d avant rcall m_g_ar ;moteur g arriere fin_virage_sw: rcall m_on ;marche des moteurs ldi temp2,$07 ;charge nombre de boucles loop3: rcall delay ;delai dec temp2 ;decremente nombre de boucles brne loop3 ;teste si termine rcall m_off ;arret des moteurs rjmp main ;continue detour_ir: rcall m_off ;arret moteurs in temp,pind ;sauve etat precedent rcall m_d_ar ;marche arriere d rcall m_g_ar ;marche arriere g rcall m_on ;activation des moteurs ldi temp2,$06 ;charge nombre de boucles loop4: rcall toggle_leds ;leds clignotantes rcall delay ;delai dec temp2 ;decremente nombre de boucles brne loop4 ;teste si termine rcall m_off ;arret moteurs sbrs temp,0 ;irg actif ? rjmp virage_ir_d ;si oui virage droite sbrs temp,1 ;ird actif ? rjmp virage_ir_g ;si oui virage gauche virage_ir_d: rcall m_d_ar ;moteur d arriere rcall m_g_av ;moteur g avant rjmp fin_virage_ir ;termine virage_ir_g: rcall m_d_av ;moteur d avant rcall m_g_ar ;moteur g arriere fin_virage_ir: rcall m_on ldi temp2,$08 ;charge nombre de boucles loop5: rcall delay ;delai dec temp2 ;decremente nombre de boucles brne loop5 ;teste si termine rcall m_off ;arret des moteurs rjmp main ;continue ;----------------------------------------------------------- ;- fin - ;-----------------------------------------------------------