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 AVR: Dlaczego układ miga tylko 3 razy? Pierwszy program na ATtiny13

benek111 07 Sty 2013 12:04 2301 16
REKLAMA
  • #1 11754161
    benek111
    Poziom 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 :
    Kod: text
    Zaloguj się, aby zobaczyć kod
    $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

    Kod: text
    Zaloguj się, aby zobaczyć kod


    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: Dlaczego układ miga tylko 3 razy? Pierwszy program na ATtiny13
  • REKLAMA
  • #2 11754200
    BlueDraco
    Specjalista - Mikrokontrolery
    Schemat niekompletny i nieczytelny - brak nazw, wartości napięć i podłączeń sygnałów zewnętrznych - co tu można zgadywać?
  • #3 11754350
    benek111
    Poziom 17  
    A tak może być ?
    Bascom AVR: Dlaczego układ miga tylko 3 razy? Pierwszy program na ATtiny13

    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).
  • REKLAMA
  • #4 11754386
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11754414
    benek111
    Poziom 17  
    Dodałem krótki opis wyżej
  • REKLAMA
  • #6 11754436
    MaxDamage18
    Poziom 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 11754461
    jousto
    Poziom 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 11754583
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11754653
    benek111
    Poziom 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 11754687
    BlueDraco
    Specjalista - Mikrokontrolery
    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 11754733
    benek111
    Poziom 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 11755254
    jousto
    Poziom 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 11755394
    benek111
    Poziom 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 11755453
    jousto
    Poziom 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.
  • REKLAMA
  • #15 11755684
    benek111
    Poziom 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:





    Kod: text
    Zaloguj się, aby zobaczyć kod


    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




    Kod: text
    Zaloguj się, aby zobaczyć kod



    I tam wartość P=255 czyli PWM0B=255 czyli na PB1 powinien być przebieg PWN a niema go.
  • #16 11757968
    jousto
    Poziom 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ń
    Kod: text
    Zaloguj się, aby zobaczyć kod

    dalej nie ma instrukcji inicjującej Timer
    Kod: text
    Zaloguj się, aby zobaczyć kod

    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 11760602
    benek111
    Poziom 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 !
REKLAMA