Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom AVR układ mignie 3 razy i koniec

benek111 07 Jan 2013 12:04 2202 16
IGE-XAO
  • #1
    benek111
    Level 17  
    Panowie to jest mój pierwszy program w Bascomie, więc nie zabijajcie mnie od razu.
    Wiem roi się tam od GOTO , wiem to zbrodnia ale tym zajmę się później. Teraz powiem o co chodzi.
    To jest program :
    Code: basic4gl
    Log in, to see the code
    $regfile = "attiny13.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 16
    $framesize = 8
    '$sim
    'ustawienie PB2 i PB3 jako wejscie i PB1 jako wyjscie
    Config Pinb.1 = Output
    Config Pinb.2 = Input
    Config Pinb.3 = Input


    Dim W As Word 'zmienna W przechowuje wartosc napiecia
    Dim B As Byte 'licznik klikow
    Dim C As Byte 'zmienna pomocnicza
    Dim L As Byte 'licznik trybu pracy
    Dim P As Byte 'wartosc pwm

    Config Adc = Single , Prescaler = Auto , Reference = Internal 'konfiguracja przetwoenika ADC Vref=1.1V

    Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down 'PWM

    Waitms 500
    Start Adc
    W = Getadc(1)
    Start Adc
    W = Getadc(1) 'odczyt napiecia na kanale 1 porcie PB2 czyli ADC1
    Stop Adc

    If W < 614 Then
    Pwm0b = 255
    Waitms 500
    Pwm0b = 100
    Waitms 500
    Pwm0b = 255
    Waitms 500
    Pwm0b = 100
    Waitms 500
    Pwm0b = 255

    End If


    P = 255 'początkowa wartosc PWM
    L = 1 'tryb FULL
    Do
    Pwm: 'główna pętla
    Pwm0b = P 'wypelnienie PWM
    If Pinb.3 = 0 Then Goto Zmiana 'sprawdzenie klika
    If L = 3 Then 'STROBO
    Waitms 500
    Pwm0b = 155
    Waitms 500

    End If

    Loop

    Zmiana: ' Sprawdzanie Klików
    B = 0 'Licznik Klików
    Goto Zegar



    Zegar: ' Pomiar Czasu Klika
    C = 0
    Do
    If Pinb.3 = 1 Then Goto Pomiar
    Waitms 2
    Incr C
    Loop Until C = 150 'max czas klika
    Goto Pwm

    Pomiar: 'czas przerwy miedzy klikami
    If C < 5 Then Goto Pwm 'pojedynczy klik wróć do głównego programu
    B = B + 1
    Waitms 4
    C = 0
    Do
    If Pinb.3 = 0 Then Goto Zegar ' kolejny klik
    Waitms 2
    Incr C
    Loop Until C = 25
    If B = 2 Then
    Goto Tryb 'wybor trybu jesli sa 2 kliki
    End If
    Goto Pwm 'powrot do pwm jesli kliki sa <>2
    Tryb: 'tryb pracy FULL, LIGHT, STROB
    L = L + 1 'licznik trybu pracy
    If L > 3 Then L = 1
    If L = 1 Then P = 255 ' Tryb Full
    If L = 2 Then P = 125 'tryb LIGHT
    Goto Pwm

    End 'end program

    Code: basic4gl
    Log in, to see the code


    Po uruchomieniu dioda mignie 3 razy i to wszystko co widać gołym okiem.
    Jak puszczam program na symulatorze to reaguje na poziom napięcia na PB2 bo pomija MIGNIĘCIA przy odpowiednio wysokim napięciu na wejściu.
    Reaguje na zmiany na PB3 bo zmienia tryb czyli zmienia się wartość L i wartość PWM0B.
    Natomiast na wyjściu PB1 na symulatorze nic się nie dzieje , nie zapala się dioda.
    W układzie rzeczywistym jak wspomniałem dioda mignie 3 razy i koniec. Na wyjściu PB1 jest 0V. Natomiast na wejściu PB3 czyli tam gdzie dokonywany ma być pomiar czy jest 1 czy 0 (kliknięcia wyłącznika) napięcie skacze pomiedzy 0V a 1.4V.
    Proszę o pomoc.
    A to schemat układu

    Bascom AVR układ mignie 3 razy i koniec
  • IGE-XAO
  • #2
    BlueDraco
    MCUs specialist
    Schemat niekompletny i nieczytelny - brak nazw, wartości napięć i podłączeń sygnałów zewnętrznych - co tu można zgadywać?
  • #3
    benek111
    Level 17  
    A tak może być ?
    Bascom AVR układ mignie 3 razy i koniec

    Kliki realizowane są przez krótkie naciśniecie wyłącznika i zliczane. 2 razy klik powoduje zwiększenie zmiennej B o 1. Jeśli B=2 czyli 2-i klik następuje zmiana wartości zmiennej L czyli zmiana trybu ( wartości PWM). Kliki badane są na wejściu PB3.
    Na wejściu PB2 mierzona jest wartość napięcia zasilana, jeśli jest za niska powinny nastąpić 3 mignięcia diody
    Na wyjściu PB1 wystawiany ma być sygnał PWM o danej wartości w zależności od wybranego trybu ( wartość L).
  • IGE-XAO
  • #4
    BlueDraco
    MCUs specialist
    Od biedy może, chociaż daleko mu do standardów rysowania schematów propagowanych na elektroda.pl. Teraz to już tylko nie rozumiem, po co te 4 rezystory i jak to ma działać/ do czego służyć.
  • #5
    benek111
    Level 17  
    Dodałem krótki opis wyżej
  • #6
    MaxDamage18
    Level 10  
    Według mnie, masz źle ustawioną pętlę Do..Loop. Pokombinuj z tą pętlą. Procek Ci tylko raz z czytuje wartości z ADC bo jest przed tą pętlą, takie moje zdanie przy szybkim rzuceniu okiem na kod
  • #7
    jousto
    Level 17  
    Skoro jest to Twój pierwszy program to może zacznij od czegoś prostego. Zamiast używać od razu ADC i to do niewiadomo czego?
    Jakie zadanie ma ten układ realizować?

    i PS.Co to jesk Klik.
  • #8
    BlueDraco
    MCUs specialist
    A gdzie ten wyłącznik do "klików" podłączyłeś i jak procesor ma zliczać wciśnięcia?

    Do czego służy dzielnik R3-R4?
  • #9
    benek111
    Level 17  
    To jest mój pierwszy program w Bascomie a nie w ogóle. I moim zdaniem jest to coś prostego właśnie. Ale nie oto chodzi.
    Przetwornik ADC ma zmierzyć na początku jeden raz napięcie akumulatora ( pierwszy pomiar odrzucam bo może być niewłaściwy). Po stwierdzeniu, że napięcie jest poniżej wartości ustalonej dioda ma mignąć 3 razy żeby poinformować użytkownika iż kończy się bateria. Potem jest już nie potrzebny ADC więc jest instrukcja STOP ADC ( chociaż nie wiem czy potrzebnie bo w trybie SINGLE przetwornik mierzy napięcie CHYBA tylko jeden raz ale nie mam pewności co jest skutkiem czytania w internecie bo każdy mówi co innego). I ten że ADC mierzy na PB2 napięcie z dzielnika R!/R2.
    Teraz klik. Klik to króciutkie naciśnięcie wyłącznika bez całkowitego wyłączenia. W tym momencie następuje spadek napięcia na PB3 dzielnik na R3/R4 ale cały układ działa nadal bo proc ma podtrzymanie z kondensatora 100uF C2. Jeśli proc wykryje 2 kliki/ 2 krótkie wciśnięcia zwiększa wartość zmiennej B do 2 przechodzi do etykiety TRYB i zmienia tryb świecenia czyli zmienną L do której przypisana jest wartość PWM0B wystawiana na port PB1.
    Takie jest założenie.
    Tak jak pisałem w emulatorze ładnie reaguje na poziom napięcia z przetwornika ADC , ładnie reaguje na Kliki czyli zmienia tryby i wartość PWM .Ale na porcie PB1 nie ma sygnału chociaż ładnie widać jak program przechodzi do linii w pętli głównej z instrukcją Pwm0b = P przypisującej wartość 255 lub 125 w zależności od trybu, więc powinien tam być sygnał o różnym wypełnieniu a nie 0V.
  • #10
    BlueDraco
    MCUs specialist
    Ale po co tak dziwacznie? Podłącz przycisk między masę i nogę portu, a kiedy chcesz wyłączyć światło - usypiaj mikrokontroler. Pobór prądu w uśpieniu będzie pomijalnie mały. W ten sposób masz w układzie jeden niskoprądowy guziczek zamiast bistabilnego wyłącznika na 350 mA.
  • #11
    benek111
    Level 17  
    Po wyłączeniu bistabilnego wyłącznika pobór prądu będzie Zero. Wybacz mi ale na razie chciałbym uruchomić program i dowiedzieć się co skopałem, że nie działa. Mignie trzy razy i koniec i to niezależnie od wartości napięcia zasilającego czyli nie wykrywa też progu ustawionego w programie napięcia.
    A co do wyłącznika to musi on pełnić rolę tzw. Idioten sicherungu ale to już inna dyskusja.
  • #12
    jousto
    Level 17  
    Z przedstawionego schematu nie wynika że kiedykolwiek napięcie na PB.3 będzie wynosiło 0V w stosunku do wartości napięcia zasilającego układ. Dlatego układ nie zadziała.

    Dodano po 3 [minuty]:

    R3 i R4 tworzą zwykły dzielnik napięcia i na PB.3 ustala się napięcie w wysokości R3/R4*Vzas czyli ok.1/3Vzas
  • #13
    benek111
    Level 17  
    No widzisz i tu się mylisz. Po rozłączeniu wyłącznika na kilka ms napięcie na PB3 spadnie poniżej 1 logicznego. A proc będzie podtrzymany z C2. Zauważ diodę w układzie, która "blokuje napięcie z c2 " żeby nie wystąpiło na PB3 w momencie kliku.
    Ale klikanie to wtórna sprawa, Lampka ma świecić po załączeniu bo PWM jest ustawione na 255 czyli max i taki przebieg powinien być na PB1.
    Tak że stan PB3 nie powinien mieć wpływu na to, że w ogóle świeci ale na to jak świeci.
  • #14
    jousto
    Level 17  
    Pomijając sprawę kodu do którego są uwagi, to tak z ciekawości zapytam jak długo podtrzymywane jest napięcie na kondensatorze C2 aby zapewnić prawidłową pracę uC w czasie gdy nie jest zasilany z baterii? I czy jesteś pewien że w czasie tych kilku ms spadek napięcia na C2 nie spowoduje zadziałania układu Brownout w uC i nie spowoduje jego RESETU.
  • #15
    benek111
    Level 17  
    Tak jestem pewien,że te kilka ms wystarczy.
    A miałeś kiedyś w ręce taką latarkę sterowaną z uC ? Wszystkie one tak właśnie mają przełączane tryby i podtrzymanie przez kondensator wystarcza. Ale jak to zwykle bywa nie wszystkim odpowiadają tryby oryginalne czy wybieranie ich przez jeden klik , więc zmieniają sobie oprogramowanie. Wybieranie przez jeden klik ma tą wadę iż jest dużo przypadkowych przełączeń trybów. A duża liczba zupełnie nie potrzebnych komuś trybów też jest bardzo uciążliwa. Brak sygnalizacji stanu aku sam rozumiesz trzeba go wyjmować i mierzyć miernikiem. Ale to są wszystko sprawy nie istotne. Nawet jak całe wybieranie trybów nie będzie działać to i tak na porcie PB1 powinien być sygnał PWM a go nie ma i to jest PROBLEM.
    Jakby mi się uC chciał programować w układzie to mógłbym do upadłego eksperymentować ale ciągle go wylutowywać to może źle się to skończyć.

    Mówisz że do kodu są uwagi no właśnie jakie ? Właśnie chciałbym żebyście mieli jakieś uwagi.
    Bez klikania program kręci się w pętli:





    Code: basic4gl
    Log in, to see the code


    Do
    Pwm: 'główna pętla

    Pwm0b = P 'wypelnienie PWM
    If Pinb.3 = 0 Then Goto Zmiana 'sprawdzenie klika
    If L = 3 Then 'STROBO
    Waitms 500
    Pwm0b = 155
    Waitms 500

    End If

    Loop




    Code: basic4gl
    Log in, to see the code



    I tam wartość P=255 czyli PWM0B=255 czyli na PB1 powinien być przebieg PWN a niema go.
  • #16
    jousto
    Level 17  
    Jeżeli jesteś pewien, że układ jest elektrycznie poprawny (w co ja osobiście wątpię i nie wierzę, że w tej konfiguracji będzie działał) to jeśli chodzi o uwagi do programu (pomijając jego nieczytelność ze względu na zastosowanie instrukcji skoków bezwarunkowych oraz etykiet, pierwszą która się nasuwa to
    brak instrukcji załączającej system przerwań
    Code: basic4gl
    Log in, to see the code

    dalej nie ma instrukcji inicjującej Timer
    Code: basic4gl
    Log in, to see the code

    to na początek, żeby w ogóle mogla zadziałać pętla ze świeceniem diody.

    i tak jeszcze jakie jest napięcie na pinie1 czyli na końcówce RESET
  • #17
    benek111
    Level 17  
    No widzisz musisz się nawrócić i uwierzyć. Wiara czyni cuda. :D
    A tak na poważnie układ już działa , jest elektrycznie poprawny.
    I na pewno chcielibyście wiedzieć co było nie tak w programie ?
    Jeden mały parametr określający kierunek zliczania licznika a mianowicie :
    zamiast Compare B Pwm = Clear Down użyłem
    Compare B Pwm = Clear Up i zaczęło działać.
    Dziwne bo wydawało mi się iż powinno być odwrotnie.
    To, że kod jest koszmarnie napisany zaznaczyłem na początku. Chodziło mi o to aby algorytm był poprawny. Teraz poprawię kod tak aby można go było ludziom na oczy pokazać i będzie ok.
    Dzięki wszystkim za zaangażowanie !