logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[bascom] atmega8 - proszę o sprawdzenie kodu

krynioza 23 Sty 2011 15:46 1664 4
REKLAMA
  • #1 9046087
    krynioza
    Poziom 10  
    Witam.
    Proszę o sprawdzenie kodu:
    
    $regfile = "m8def.dat"
    Config Pind.0 = Input
           Pind.0 = 0
    Config Pinb.1 = Output
           Pinb.1 = 0
    Config Pinb.2 = Output
           Pinb.2 = 0
    Do
    Debounce Pind.0 , 1 , Pr1 , Gosub
    Debounce Pind.0 , 1 , Pr2 , Gosub
    Loop
    
    Pr1:
     Portb.1 = 1
     Waitms 100
     Portb.1 = 0
     Waitms 100
     Portb.2 = 1
     Waitms 100
     Portb.2 = 0
     Waitms 100
     Portb.1 = 1
     Portb.2 = 1
    Return
    
    Pr2:
     Reset Portb.1
     Reset Portb.2
    Return
    
    End
    


    Założenia:
    Po po podaniu "1" na pd0 uruchamia się podprogram "pr1"
    Po podaniu drugi raz "1" na pd0 resetują się używane porty i wszystko zaczyna się od nowa.

    Po skompilowaniu i zaprogramowaniu układ działa tak że czasami działa dobrze a czasami po podaniu drugiej "1" przechodzi do "pr1" a powinien do "pr2".

    Proszę o pomoc.
    pozdrawiam.
  • REKLAMA
  • #2 9046226
    xamrex
    Poziom 28  
    JA sie za dobrze nie znam, ale wydaje mi się, że tu program tak jak mówisz losowo ci wybierze pr1 lub pr2.
    Masz w pętli:
    Do
    Debounce Pind.0 , 1 , Pr1 , Gosub
    Debounce Pind.0 , 1 , Pr2 , Gosub
    Loop 
    

    i zależy w jakim momencie naciśniesz przycisk.
    Ja bym zrobił coś takiego:
    
    $regfile = "m8def.dat"
    Config Pind.0 = Input
           Pind.0 = 0
    Config Pinb.1 = Output
           Pinb.1 = 0
    Config Pinb.2 = Output
           Pinb.2 = 0
    Do
    Debounce Pind.0 , 1 , Pr1 , Gosub
    Loop
    
    Pr1:
    Do
    Debounce Pind.0 , 1 , Pr2 , Gosub
     Portb.1 = 1
     Waitms 100
     Portb.1 = 0
     Waitms 100
     Portb.2 = 1
     Waitms 100
     Portb.2 = 0
     Waitms 100
     Portb.1 = 1
     Portb.2 = 1
    Loop
    
    Return
    
    Pr2:
    Do
    Debounce Pind.0 , 1 , Pr1 , Gosub
     Reset Portb.1
     Reset Portb.2
    Loop
    Return
    
    End
    
  • REKLAMA
  • Pomocny post
    #3 9046287
    zumek
    Poziom 39  
    krynioza napisał:
    Witam.
    Proszę o sprawdzenie kodu:
    
    $regfile = "m8def.dat"
           ...
           Pind.0 = 0
           ....
           Pinb.1 = 0
           ...
           Pinb.2 = 0
    


    Co to za bzdurne operacje :?:

    krynioza napisał:

    Założenia:
    Po po podaniu "1" na pd0 uruchamia się podprogram "pr1" ...

    Aby to zadziałało z przyciskiem, to MUSISZ PIND.0 "ściągnąć" do GND za pomocą rezystora np.10k.
    Jeżeli będziesz używał przycisku docelowo, to podłącz go do PIND.0 i do GND, a wtedy rezystor o którym wspomniałem nie będzie potrzebny, tylko trzeba wtedy zmienić nieco kod.
    Moja propozycja:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Pind.0 = Input
    Config Pinb.1 = Output
            Portb.1 = 0
    Config Pinb.2 = Output
            Portb.2 = 0
    Do
       Debounce Pind.0 , 1 , Pr1 , Gosub
    Loop
    
    Pr1:
    
    If Portb.1 = 0 Then
       Portb.1 = 1
       Waitms 100
       Portb.1 = 0
       Waitms 100
       Portb.2 = 1
       Waitms 100
       Portb.2 = 0
       Waitms 100
       Portb.1 = 1
       Portb.2 = 1
    Else
       Reset Portb.1
       Reset Portb.2
       Waitms 400
    End If
    
    Return
    


    xamrex
    Twój kod "rozwali" stos :D
  • REKLAMA
  • #4 9046311
    xamrex
    Poziom 28  
    Ostatnio też napisałem program do obsługi 2 7segmentowcyh wyświetlaczy i stos się rozwalił :P (w przerwaniu program przechodził do funkcji)
    W jaki sposób potrafisz poznać, że taki kod może być niebezpieczny dla stosu?
  • #5 9046377
    krynioza
    Poziom 10  
    Dzięki za pomoc ;D jestem bardzo początkujący więc proszę o wyrozumiałość ;P program który zaproponował zuek spełnia założenia ;)
REKLAMA