Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom][ATMEGA8] Przycisk - 2 funkcje

bb5 14 Sie 2008 18:32 2052 10
  • #1 14 Sie 2008 18:32
    bb5
    Poziom 15  

    Jak napisać pogram dla ATMEGA8 który po pierwszym naciśnięciu ustawiał by wszystkie porty na wejścia a po kolejnym na wyjścia?
    Czy może to być tak (przycisk podpięty do gnd i Port C1):

    Code:

    $regfile "m8def.dat"
    $crystal = 8000000

    Do

             If Pinc.1 = 0 Then
             Config Portb = &B11111111
             End If

             If Pinc.1 = 0 Then
             Config Portb = &B00000000
             End If

    Loop

    0 10
  • #2 14 Sie 2008 18:39
    Vampir8
    Poziom 16  

    nie wiem czy zadzial pisze z pamieci

    Code:
                     $regfile "m8def.dat"
    
    $crystal = 8000000

    Do
             If Pinc.1 = 0 Then
             Config Portb = Not Portb
             End If
    Loop

    i chyba jeszcze trzeba skonfigurowac port jako wyjscie
    Code:
    Config PORTB = Output

    0
  • #3 14 Sie 2008 18:43
    bb5
    Poziom 15  

    Dlaczego po

    Code:
     Config Portb =
    jest
    Code:
     Not Portb
    ?

    0
  • #4 14 Sie 2008 20:51
    Vampir8
    Poziom 16  

    Chyba "config" ma tam nie byc, config konfiguruje port jako wejsciowy lub wyjsciowy, a tobie chyba chodzi o stan wysoki na porci i stan niski??

    portb = not portb
    to jest negacja
    czyli na porcieb ustawiasz bity odwrotnosci bitow portub ;)

    a dziala to wogole?
    bo nie mam przy sobie kompilatora zeby spr.

    Dodano po 2 [minuty]:

    Code:
    $regfile "m8def.dat"
    
    $crystal = 8000000

    Config Portb = Output
    Config portc.1 = input

    Do
             If Pinc.1 = 0 Then
             Portb = Not Portb
             End If
    Loop

    0
  • #5 14 Sie 2008 21:03
    grafiksaba
    Poziom 10  

    ja bym to zrobił inaczej, bo Twoje rozwiązanie według mnie nie zadziała. Według mnie najpierw wszystkie porty ustawisz jako wyjścia a zaraz potem jako wejścia. Ja bym to zrobił tak, utworzył dodatkową zmienną

    <code>



    dim kierunek_portu as bit

    do

    if pinc.1 = 0 then

    toggle kierunek_portu
    endif

    if kierunek portu = 1 then
    config porb = output
    else
    config portb = input
    endif
    loop
    end



    </code>

    a tak na marginesie to Config Portb = &B11111111
    to jest jako wejście czy wyjście, zawsze pisałem input output?:) Mało pisałem na razie:)

    0
  • #6 14 Sie 2008 21:06
    Vampir8
    Poziom 16  

    Code:
     Portb = toggle Portb 


    ja programuje w mikropascalu i to dziala
    Code:
    program button_test;   
    
    var oldstate : byte;
    begin
      DDRD:=$FF;
      while true do
        begin
          if Button(PORTB, 0, 1, 1) then oldstate := 255;
          if oldstate and Button(PORTB, 0, 1, 0) then
          begin
            PORTD := not(PORTD);
            oldstate := 0;
          end;
        end;
    end.

    0
  • #7 14 Sie 2008 21:38
    dawid512
    Poziom 32  

    Code:
    ....
    

    config pinc.1 = input
    set portc.1

    declare sub we
    declare sub wy
    do

    if pinc.1 = 0 then
    gosub we
    end if

    loop
    end

    sub we

    DDRB = &B00000000
    DDRC = &B00000000
    DDRD = &B00000000
    do

    if pinc.1 = 0 then
    gosub wy
    end if

    loop
    end sub

    sub wy

    DDRB = &B11111111
    DDRC = &B11111101
    DDRD = &B11111111

    do

    if pinc.1 = 0 then
    gosub we
    end if

    loop
    end sub


    Na szybko i z pamieci ale powinno dzialac.

    0
  • #8 14 Sie 2008 21:56
    osnapus
    Poziom 18  

    Panowie a co z tym że w czasie trzymania przycisku program będzie bez przerwy wykonywał przełączanie... Bo przecież w takiej konfiguracji jak piszecie to jedno krótkie dla człowieka naciśnięcie przycisku to będzie kilka wykonanych cykli zmiany wyjść na wejścia i odwrotnie...

    0
  • #9 14 Sie 2008 22:22
    n01x
    Poziom 12  

    osnapus napisał:
    Panowie a co z tym że w czasie trzymania przycisku program będzie bez przerwy wykonywał przełączanie... Bo przecież w takiej konfiguracji jak piszecie to jedno krótkie dla człowieka naciśnięcie przycisku to będzie kilka wykonanych cykli zmiany wyjść na wejścia i odwrotnie...


    while...wend

    0
  • #10 15 Sie 2008 12:12
    bb5
    Poziom 15  

    Może powiem do czego potrzebuje ten program. Buduję sekundnik na dwóch wyświetlaczach 7-segmentowych, ATMEDZE8 i przycisku. I miał by on działać na takiej zasadzie: jak naduszę przycisk to zaczyna naliczać sekundy jak naduszę drugi raz to zatrzyma naliczanie.
    Przez cały czas cyferki mają się wyświetlać.

    0
  • #11 16 Sie 2008 22:09
    dawid512
    Poziom 32  

    Zmienia postać rzeczy a więc... musisz wykorzystać źródło zewnetrznego pzrerwania czyli INT. Podlacz przycisk do INT0 i wtedy wpisz:

    Code:


    ....
    Config INT0 = Low level
    On INT0 przycisk

    .........
    .....

    przycisk:
    ....
    ....
    ....

    return



    Teraz wpisz tylko co ma się wykonywać w przerwaniu które wywoła nacisniecia przyckisku ;)

    0