Zacznę od tego iż z mikrokontrolerami mam stycznośc od kilku tygodni wiec nie wiem za dużo na ten temat. Pisałem temat na diodzie ponieważ nie mogłem ruszyć teraz jak już teoretycznie ruszyłem to nie wiem czy moge mieć to co mam.
Teraz pytanie co mam.
Mam napięcie na nóżkach mikrokontrolera 2.18v prawie na każdej nóżce. Dlatego nie mogłem sterować I/0 ponieważ cały czas miałem napięcie ale teraz poradziłem już sobie i podaje zamiast napięcia to mase. Ale i tak mam takie napięcie.
I np. czy jak podepne LCD 2x16 bo takowy posiadam to nie bedzie problemów.??
Moge miec takie napięcie ?? i z czego to sie bierze może jak to wyeliminować ??
Witam!
Niech kolega napisze:
1. jaki mikrokontroler stosuje,
2. jak wygląda cały układ elektroniczny ( to jest jakaś płytka testowa? ),
3. w czym kolega pisze program i niech wyśle kod programu.
Bo na razie niewiele wiadomo i trudno będzie koledze pomóc.
1) Mikrokontroler Atmega8
2) Oczywiście płytka testowa. ( jak narazie kombinuje i nie ma sensu wszystkiego po kilkaset razy lutować)
3) Program jest napisany w BascomAVR
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb.1 = Output
Portb.1 = 1
Config Portc.5 = Input
Portc.5 = 1
Do
If Pinc.5 = 0 Then
Waitms 150
Toggle Portb.1
End If
Loop
End
Ten program działa ponieważ jak pisałem wyżej na nóżkach mam wciąz napięcie i musze sterować masą. Gdybym nie miał napięcia mógł bym podawać Vcc na przycisk
Atmega 8 jest układem cyfrowym, więc na nóżkach zdefiniowanych jako wyjście w tym wypadku Portb może być napięcie bliskie 0V lub bliskie Vcc.
Cytat:
...podaje zamiast napięcia to mase.
Gdzie to kolega podaje, na który pin?? Na wszystkie nóżki??
Cytat:
...na nóżkach mam wciąz napięcie i musze sterować masą. Gdybym nie miał napięcia mógłbym podawać Vcc na przycisk
Niestety nie rozumiem jak kolega steruje masą...
Bez schematu wiele nie zdziałamy, niech kolega podeśle link do strony z schematem, albo podeśle schemat w Eaglu lub jako jpg.
Jakie jest napięcie zasilania układu scalonego?
Z tego co widzę kolega jest przyzwyczajony do logiki dodatniej - stan aktywny wysoki +vcc . I chciałby nadal w ten sposób sterować atmegę czyli podawać plus aby wywołać reakcję procesora. Proponuję dwa rozwiązania.
1. Przestać myśleć szablonowo i zaakceptować fakt że w wielu przypadkach za stan aktywny uważa się stan niski.
2. Zrezygnować z wewnętrznego rezystora pull-up (portc.5 = 0) i dodać zewnętrzny rezystor pomiędzy nóżkę c.5 procesora i masę (czyli skomplikować układ).
Osobiście szczerze radzę sięgnąć po pierwszą możliwość bo są też układy peryferyjne dla których też stanem aktywnym często jest "0" i wtedy nie będziesz miał problemu ze skomplikowanymi rozwiązaniami i dokładaniem sobie zbędnej pracy.
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb.1 = Output
Portb.1 = 0
Config Portc.5 = Input
Portc.5 = 0
Do
If Pinc.5 = 1 Then
Waitms 150
Toggle Portb.1
End If
Loop
End
I w ten sposób nic nie działa a teoretycznie powinno. A dlaczego nie działa ??
Więc ten program wygląda tak że gdy na pinc.5 podam Vcc to zmienia sie stan na portb.1.
ALE ja mam jak pisałem wyżej na nogach napięcie 2.16 wiec on brał sobie ten prąd i nic mi nie działało.
Gdy kombinowałem tak długo aż zmieniłem program ( ten w poprzednim poście) i on działa dlatego że na nogach jest prąd.
ALE jak pisałem wyżej steruje masą. Czyli gdy na portc.5 podam GND to na pinb.1 mam wtedy Vcc i wszystko śmiga.
Ale moje pytanie jest takie jak np. podłącze wyświetlacz pod Atmege8. (mam 2 sztuki i tak samo to działa)
Ona ma napięcie na nogach i czy nie będzie to przeszkadzało w tym aby on poprawnie działał ??
Teraz jeszcze obczaiłem że jeżeli w programie napisze:
Atmega 8 jest układem cyfrowym, więc na nóżkach zdefiniowanych jako wyjście w tym wypadku Portb może być napięcie bliskie 0V lub bliskie Vcc.
A słyszał kolega o stanie wysokiej impedancji na wejściu HI-z ??? w tym stanie (a w taki wprowadza autor) normalnym jest, że napięcie może być prawie dowolne pomiędzy 0-5V (jest wtedy pływające i to całkiem normalny jeden ze stanów w technice cyfrowej)
Dzieje się tak dlatego, że pn ustawiony jest jako wejście i nie jest podciągnięty ani zewnętrznym rezystorem ani wewnętrznym np do VCC.
Druga sprawa panie autor - jak chcesz przestawiać jakiś pin na wejście alb wyjście w Bascomie to pisz tak jak się należy i tak jak masz to opisane w Helpie, czyli:
czyli ustawiasz nogę portu C.5 jako wejście a drugą instrukcją robisz tzw programowe podciąganie do VCC rozumiesz ???? wtedy na wejściu nie będziesz miał, żadnego napięcia pływającego pomiędzy 0 a 5V i ładnie będzie reagowało na
(bo to jest ustawienie jako wyjście !!!! a nie twoje Config Portc.4=Output) to twoje polecenie nic nie robi , a że domyślnie Bascom wszystkie Piny po resecie ustawia jako wyjścia (to też zapamiętaj sobie) to dlatego akurat działa ci już prawidłowo następna instrukcja:
Poprawka , nawet może jeśli w Bascomie poprawnie działa Config Portc.5=Input zamiast Config Pnc.5=Input to nie zmienia faktu, że jeśli ustawisz pin jako wejście:
Config Pinc.5 = Input
a następnie zdejmiesz programowe podciąganie do VCC poprzez polecenie:
Portc.5=0
to wtedy właśnie uzyskasz wejście w stanie wysokiej impedancji
domyślnie Bascom wszystkie Piny po resecie ustawia jako wyjścia (to też zapamiętaj sobie)
Czy aby na pewno?
Z tego co pamiętam kiedy jeszcze bawiłem się Bascomem to tak było. A teraz? Co za problem sobie sprawdzić w helpie albo doświadczalnie. Jedno czy drugie to "dwa" ruchy ręką.
Od kiedy pamiętam to nie skonfigurowane piny są wejściami. A działanie instrukcji portx.x = 1 po resecie włączy rezystor podciągający i też miernik pokaże 5v, a po instrukcji portx.x = 0 może pokazać wartość bliską zeru. Jutro sprawdzę doświadczalnie, a co mi tam .
P.S. Zajrzałem sobie na stronę kolegi mirekk36, cytat:
"Zapraszamy na kursy programowania mikrokontrolerów AVR.
.
.
3. programowanie mikroprocesorów w językach: Bascom, asembler oraz C"
Hmm, i później po takim kursie delikwent jest święcie przekonany że jak nie skonfiguruje portu to będzie miał wyjścia, a układ jeśli działa to tylko cudem z powodu obecności rezystora podciągającego. Ile jeszcze błędnych informacji można wynieść z takiego kursu... ?
Nie sądzę aby to było jaśniej. Namąciłeś mu w głowie okropnie!.....
O wiele łatwiej jest przeczytać ze zrozumieniem jeden mały paragraf w „BASCOM Manual” odnośnie konfiguracji portów (str.145/146) PortB As General Digital I/O, gdzie w bardzo wyraźny sposób określono różnice co należy rozumieć PORT a co jest PIN. W dalszej części wyraźnie określono możliwość alternatywnego stosowania jednego lub drugiego terminu, bo w sumie cała konfiguracja kierunku PORTu jako całej szerokości lub pojedynczego BITu/PINu sprowadza się do edytowania lub konfiguracji DDRx.
Autor tego wątku zapewne przeoczył ten paragraf i ma trudności ze zrozumieniem configuracji kierunku portu lub pojedynczego bitu/pinu.
Także wydaje mi się że nie bardzo jest mu znana istota/koncept i potrzeba podciągania „pull up” (nie ważne czy to jest wewnętrzne lub zewnętrzne) dla Input posługując się „prostą ludzką logiką myślenia”, którą nie bardzo wygodnie jest wdrożyć do świata cyfrowego. Wygodniejsze jest tu stosowanie odwrotnej logiki - „ZERO (stan niski) jako Input”.
Poza tym: “By default, the DDR and PORT registers are 0.” Zdaje się że zero dla DDR oznacza INPUT a nie OUTPUT, a dla portu - nieaktywne wewnętrzne podciąganie. A to nie ma juz związku z Bascom.
.
3. programowanie mikroprocesorów w językach: Bascom, asembler oraz C"
Hmm, i później po takim kursie delikwent jest święcie przekonany że jak nie skonfiguruje portu to będzie miał wyjścia, a układ jeśli działa to tylko cudem z powodu obecności rezystora podciągającego. Ile jeszcze błędnych informacji można wynieść z takiego kursu... ?
Zacznij kolego najpierw czytać ze zrozumieniem, potem się trochę doucz żeby później nie wypisywać takich bzdur. (pod koniec mojego postu zanim mnie "dopadliście" sam napisałem, że być może nie pamiętam domyślnych ustawień Bascoma. A czytanie ze zrozumieniem i sprawdzanie tego co ktoś pisze na forum to podstawa - zamiast ślepego wykonywania takich porad szczególnie takich jak twoje:
danthe napisał:
Z tego co widzę kolega jest przyzwyczajony do logiki dodatniej - stan aktywny wysoki +vcc . I chciałby nadal w ten sposób sterować atmegę czyli podawać plus aby wywołać reakcję procesora. Proponuję dwa rozwiązania.
1. Przestać myśleć szablonowo i zaakceptować fakt że w wielu przypadkach za stan aktywny uważa się stan niski.
2. Zrezygnować z wewnętrznego rezystora pull-up (portc.5 = 0) i dodać zewnętrzny rezystor pomiędzy nóżkę c.5 procesora i masę (czyli skomplikować układ)....
Kurczę logika dodatnia do sterowania atmegi, szablonowe myślenie o przypadkach. Takie szablonowe myślenie o chyba tylko ty miałeś.
Skomplikowanie układu rezystorem - szok!
Pomyśl na drugi raz zanim zaczniesz wypisywać takie bzdury.
emarcus napisał:
Nie sądzę aby to było jaśniej. Namąciłeś mu w głowie okropnie!.....
O wiele łatwiej jest przeczytać ze zrozumieniem jeden mały paragraf w „BASCOM Manual” odnośnie konfiguracji portów (str.145/146) PortB As General Digital I/O, gdzie w bardzo wyraźny sposób określono różnice co należy rozumieć PORT a co jest PIN. W dalszej części wyraźnie określono możliwość alternatywnego stosowania jednego lub drugiego terminu, bo w sumie cała konfiguracja kierunku PORTu jako całej szerokości lub pojedynczego BITu/PINu sprowadza się do edytowania lub konfiguracji DDRx.
Autor tego wątku zapewne przeoczył ten paragraf i ma trudności ze zrozumieniem configuracji kierunku portu lub pojedynczego bitu/pinu.
Także wydaje mi się że nie bardzo jest mu znana istota/koncept i potrzeba podciągania „pull up” (nie ważne czy to jest wewnętrzne lub zewnętrzne) dla Input posługując się „prostą ludzką logiką myślenia”, którą nie bardzo wygodnie jest wdrożyć do świata cyfrowego. Wygodniejsze jest tu stosowanie odwrotnej logiki - „ZERO (stan niski) jako Input”.
Poza tym: “By default, the DDR and PORT registers are 0.” Zdaje się że zero dla DDR oznacza INPUT a nie OUTPUT, a dla portu - nieaktywne wewnętrzne podciąganie. A to nie ma juz związku z Bascom.
e marcus
Dużo lepszym specjalistą od mącenia jest widzę kolega. Chyba przez to, że aby coś zrozumieć stosujesz logikę zbyt odwrotną.
Na początek poczytajcie sobie dobrze Helpa Bascoma z niego się dowiecie, że istanieje tzw trzeci stan - stan wysokiej impedancji Hi-Z !!!
na czerwono zaznaczyłem - to, że w Bascomie domyślnie piny ustawiane są jako wejścia - więc w kilku postach wyżej pomyliłem się ale też od razu zaznaczyłem, że nie pamiętam, że może jest odwrotnie i autor musi sam sprawdzić. Wyraźnie opisałem jak zmienia się ustawienia pojedynczych pinów portów, nie omawiając ustawiania kierunku całych portów.
Zajrzyjcie sobie jeden z drugim do HELPA:
i poczytajcie proszę ze zrozumieniem.
A dodatkowo nie wciskajcie kitów o waszych logikach zbyt odwrotnych, o ciężkim komplikowaniu układu przez dodanie rezystora czy przez próbę zrozumienia co to jest podciąganie bo to akurat jest jedną z podstaw przy programowaniu procków.
Mnie również zdarzało się popełnić jakiś błąd doradzając na tym forum, ale gdy wskazywano mi możliwość pomyłki natychmiast to sprawdzałem i poprawiałem a nie odsyłałem z tekstem typu "mogę się mylić, sprawdź sobie sam".
Dziwi mnie również taka ostra reakcja na krytykę.
Odnośnie logiki dodatniej / ujemnej to chyba żartujesz?
Cytuję za wikipedią :
Cytat:
Jeśli do napięć wysokich zostanie przyporządkowana logiczna jedynka, a do niskich logiczne zero, wówczas mówi się, że układ pracuje w logice dodatniej (inaczej zwaną pozytywną), w przeciwnym razie mamy do czynienia z logiką ujemną (inaczej zwaną negatywną).
W notach wielu układów cyfrowych znajdziesz określenie "active low" oznaczające że stanem aktywnym jest 0 !
Ponadto próbujesz doradzać osobie która jest właśnie na etapie podstaw działania mikrokomputerów jednoukładowych (oceniam na podstawie postów autora), więc myślę że nie można za wiele wymagać i trzeba jasno i wyraźnie wytłumaczyć z czym ma do czynienia.
Żeby właściwie skonfigurować porty Atmegi są następujące możliwości:
Config Pinx.y = input/output - konfiguruje pojedynczy pin (y) portu (x) jako wejście lub wyjście.
Config Portx = input/output - konfiguruje cały port (x) jako wejście lub wyjście.
Config Portx = wartość - konfiguruje portx według podanej wartości, najłatwiej w postaci binarnej czyli &bxxxxxxxx
Przykłady:
Config Pinb.0 = input - Pin b.0 jest wejściem
Config Pinb.1 = output - Pin b.0 jest wyjściem
Config Portb = &b10000001 = pin b.0 oraz b.7 jest wyjściem (1) pozostałe piny portu b są wejściami (0)
Gdy pin jest skonfigurowany jako wejście jest jeszcze możliwość włączenia wewnętrznego rezystora podciągającego wejście do +VCC przez ustawienie portu (w tym przykładzie b.0) w stan wysoki - Portb.0 = 1
Rezystor podciągający ma wartość w przedziale 20k do 100k (zaczerpnąłem z noty katalogowej).
$regfile = "m8def.dat"
$crystal = 1000000
Config Pinb.1 = Output
Config Pinc.5 = Input
Portb.1 = 0 'na wyjściu 0V
Portc.5 = 1 ' wejście podciągamy do +5V
Do
If Pinc.5 = 0 Then 'zwarcie pinu c.5 do masy spowoduje spełnienie warunku
Waitms 150
Toggle Portb.1
End If
Loop
End
Żeby właściwie skonfigurować porty Atmegi są następujące możliwości:
Config Pinx.y = input/output - konfiguruje pojedynczy pin (y) portu (x) jako wejście lub wyjście.
Config Portx = input/output - konfiguruje cały port (x) jako wejście lub wyjście.
Config Portx = wartość - konfiguruje portx według podanej wartości, najłatwiej w postaci binarnej czyli &bxxxxxxxx
Przykłady:
Config Pinb.0 = input - Pin b.0 jest wejściem
Config Pinb.1 = output - Pin b.0 jest wyjściem
Config Portb = &b10000001 = pin b.0 oraz b.7 jest wyjściem (1) pozostałe piny portu b są wejściami (0)
Gdy pin jest skonfigurowany jako wejście jest jeszcze możliwość włączenia wewnętrznego rezystora podciągającego wejście do +VCC przez ustawienie portu (w tym przykładzie b.0) w stan wysoki - Portb.0 = 1
Rezystor podciągający ma wartość w przedziale 20k do 100k (zaczerpnąłem z noty katalogowej).
I teraz w końcu dobrze i jasno mówisz (chociaż to samo co ja wcześniej). I to jest proste wytłumaczenie a nie początkującemu o logice odwrotnej, dodatneij czy ujemnej....
$regfile = "m8def.dat"
$crystal = 1000000
Config Pinb.1 = Output
Config Pinc.5 = Input
Portb.1 = 0 ' Tutaj mam 2,16 volta
Portc.5 = 1
Do
If Pinc.5 = 0 Then
Waitms 150
Toggle Portb.1
End If
Loop
End
Tak jak napisałem mam tam 2,16 volta. A gdy napisze w tym samym miejscu:
mam tam 3.70 czy coś takiego w każdym razie powyżej 3 poniżej 4.
Moje pytanie jest takie. Wgrałem na mikrokontroler tylko do sprawdzenia programik który ma wyświetlać coś na LCD.
Po podłączeniu zasilania miał na nóżkach które mają iśc do wyświetlacze po 2,16 volta.
Sprawdź zasilanie całego układu. Jakim napięciem zasilasz procek (zmierz) oraz podaj sposób podłączenia zasilania do M8 (które nogi wykorzystujesz) ?
To jedno i najważniejsze. A po drugie sprawdź czy masz w ogóle dobry miernik. Bo tu juz kiedyś jeden osobnik walczył z 5 dni z dziwnymi napięciami zanim w końcu zobaczył że ma miernik skopany.
Warto by jeszcze wspomnieć o kondensatorach odsprzęgających 100nF ceramicznych włączonych pomiędzy GND i Vcc możliwie najbliżej wyprowadzeń układu. Tak dla wyrobienia odpowiednich przyzwyczajeń . I pytanie czy wszystkie wejścia zasilania są podłączone? Bo nie wystarczy podłączyć tylko jednej nóżki GND oraz VCC, trzeba podłączyć wszystkie GND oraz musi być zasilone także wejście AVCC.
Tak więc mam to na płytce stykowej jak pisałem wyżej. wiec tak :
VCC 7
GND 8 22
te numerki to tak jak na rysunku w datasheet. Oczywiście kondensatory posiadam w układzie. Kombinowałem bez ale wtedy jak np. włączyłem diode to napięcie spadało a z kondensatorem mam jedno.
A no i zasilanie. Mam zasilacz 9 volt. z tego idzie do stabilizatora ( z tego co pamiętam 7805cv. Ale głowy nie daje. I przy stabilizatorze oczywiście mam również kondensator.
I na procku mam 5.01Volta Czyli mysle że to mam dobrze.
Tylko dlaczego takie rzeczy sie dzieją... Co moge dołozyć ?
Koniecznie dołącz zasilanie (+5V) do nóżki AVCC czyli nr 20. Domyślam się że programujesz amegę w programatorze a następnie wkładasz ją do płytki stykowej? No i jeszcze te kondensatory 100nF, dobrze by były przy samym procku.
Przez jaki rezystor podłączasz diodę świecącą i do plusa czy do masy ?
Może dla twojego miernika przełączanie stanu 6x na sekundę to za szybko i nie może właściwie zareagować ? Po uruchomieniu tego programu powinno być 5V przez 2 sekundy i 0V przez następne 2 sekundy.
Znaczy Twój program działa idealnie ale moje nie chodzą co ja mam źle ??
A co rozumiesz pod pojęciem , że ci nie działa ??? Dioda LED podpięta do Portb.1 nie miga ci z prędkością co 150ms ??? gdy trzymasz wciśnięty klawisz ????
Tylko nie mierz napięcia - za to obserwuj miganie diody LED albo zwiększ czas ze 150ms do np 500ms
Trudno powiedzieć, odnosząc się do poprzedniej wypowiedzi może to być :
Pomyłka w konfiguracji - może mierzysz napięcie n niewłaściwej końcówce?
Może za szybko zmieniałeś stan na wyjściu (150ms) co powodowało że miernik zgłupiał?
Ustawiłem cały port b jako wyjście, i ładowałem do niego same jedynki / zera (255 = FF hex = 11111111 bin / 0 = 00 hex = 00000000 bin) co mogło wykluczyć pomyłkę w pinach wyjściowych.
Jeśli chcesz podpiąć diodę led koniecznie użyj rezystora w szereg z diodą o oporze 220 - 470 om.
Widzę że z mirekk36 chociaż innymi słowami to jesteśmy jednak zgodni.
Gdy pisze program i na input dam 0 ( więc steruje VCC, czyli gdy podpinam na dany pin vcc to działa.)
Ale nie działa bo ja na tym pinie mam napięcie i on tak jak by cały czas pracuje. Myśli że ja trzymam napięcie chociaż nie trzymam ale po zmierzeniu miernikiem jest 2.16
Nóżkę 28 (pinc.5) chcesz wykorzystywać jako wejście? (Input)
Nóżkę 15 (pinb.1) chcesz wykorzystywać jako wyjście? (Output)
Na wejście chcesz koniecznie podawać stan wysoki? (+5V)
Co chcesz podłączyć do wyjścia ?
Czy zastosowałeś się do rady i podłączyłeś +5V do nóżki 20? (AVCC)
Jeżeli na to wejście chcesz podawać stan wysoki to musisz podłączyć rezystor pomiędzy nóżkę wejściową i masę, może być powiedzmy od 1k do 10k, wtedy napięcie powinno spaść do 0V.