Skocz do zawartości

Odwrotne stany spoczynkowe.


Mateusz7764

Pomocna odpowiedź

Hej!

Posiadam płytkę od And-Tech.pl EvB 4.1

Zacząłem naukę od Bascoma już kiedyś bawiłem się tą płytką ale tylko wgrywałem skopiowane przykłady z kursu.

Zacząłem studiować to wszystko od nowa i coś mi zaczęło nie grać.

A mianowicie kiedyś na tej płytce działał taki przykład:

$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 16000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
      portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
      portd=&B0000000                      'wszędzie stan spoczynkowy-0


do                                         'pętla nieskończona

  if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
  portd.0=1                                'zapal diode
  elseif pinb.1=1 then                     'jeżeli przycisk 2 wciśnięty
  portd.0=0                                'zgaś diodę
  endif                                    'koniec bloku warunkowego

loop                                       'koniec pętli

end                                         'koniec programu 

a teraz, niedziała.. myślałem cały dzień i wymyśliłem że aby działało musi być tak:

$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 16000000                                         'definiujemy z jakim taktowaniem będzie pracował


   Config Portb = Input                                    'port b  jako wejścia
          Portb = &B11111111                               'wszędzie stan spoczynkowy-0
   Config Portc = Output                                   'pprt d jako wyjścia
          Portd = &B11111111

   Do                                                      'pętla nieskończona

  If Pinb.0 = 0 Then                                       'jeżeli przycisk 1 wciśnięty
  Portd.0 = 0                                              'zapal diode
  Elseif Pinb.1 = 0 Then                                   'jeżeli przycisk 2 wciśnięty
  Portd.0 = 1                                              'zgaś diodę
  Endif                                                   'koniec bloku warunkowego

Loop

          End             

Całkiem nie rozumiem dlaczego 1 działa jak 0 a 0 działa jak 1.

Kiedyś działało normalnie. A teraz musi być na odwrót.

Jak to "naprawić"? 😉

Proszę o pomoc.

Jeśli zły dział to proszę o przeniesienie.

Link do komentarza
Share on other sites

Jak to przeczytałem to się załamałem, dosłownie. Rozumiem, że jesteś początkujący, ale zabawy w stylu znajdź 2 różnice pomiędzy obrazkami uczą już w przedszkolu - poważnie.

W pierwszym kodzie ustalasz stany na całym porcie na 0 w 2 na 1

config portb=input 'port b jako wejścia

portb=&B00000000 'wszędzie stan spoczynkowy-0

config portd=output 'pprt d jako wyjścia

portd=&B0000000 'wszędzie stan spoczynkowy-0

Config Portb = Input 'port b jako wejścia

Portb = &B11111111 'wszędzie stan spoczynkowy-0

Config Portc = Output 'pprt d jako wyjścia

Portd = &B11111111

To już wiesz dlaczego działa odwrotnie? Poza tym jeśli masz tam podłączony jakiś przycisk, to temat był wielokrotnie wałkowany. W AVRach przycisk zwiera się do GND czyli do 0, a pin musi być podciągnięty albo przez rezystor zewnętrzny do plusa, albo przez komendę SET.

Jeśli takie są twoje początki to marnie ci wróżę z programowaniem i nie tylko.

Link do komentarza
Share on other sites

Trochę nie wiem o co ci chodzi...

Ten pierwszy kod kiedyś działał, a teraz musi być tak jak w drugim kodzie żeby działało.

Drugi kod sam pozmieniałem żeby działało.

Ale właśnie powinno być tak jak w 1 a nie jak w 2 kodzie.

No i jak to zmienić.

W kursach/przykładach są 0000 a u mnie musi być odwrotnie, 1111.

W pierwszym kodzie ustalasz stany na całym porcie na 0 w na 1

Końcówki tego zdania nie rozumiem.

Jakbyś mnie mógł tak jaśniej oświecić byłbym wdzięczny.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

wziąłem przykład z tego tematu:

https://www.forbot.pl/forum/topics20/kurs-bascom-lekcja3-zaczynamy-programowac-vt1091.htm

przykład:


config portb=input                          'port b  jako wejścia
      portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
      portd=&B0000000                      'wszędzie stan spoczynkowy-0


do                                         'pętla nieskończona

  if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
  portd.0=1                                'zapal diode
  elseif pinb.1=1 then                     'jeżeli przycisk 2 wciśnięty
  portd.0=0                                'zgaś diodę
  endif                                    'koniec bloku warunkowego

loop                                       'koniec pętli

end                                         'koniec programu 

Wgrałem na tę płytkę: (zdj z neta)

*********************************

No i nie działa.

A wgrałem ten sam kod tylko że tam gdzie stan spoczynkowy 0 dałem 1 :


config portb=input                          'port b  jako wejścia
      portb=&B11111111                     'wszędzie stan spoczynkowy-1
config portd=output                         'pprt d jako wyjścia
      portd=&B11111111                      'wszędzie stan spoczynkowy-0


do                                         'pętla nieskończona

  if pinb.0=0 then                         'jeżeli przycisk 1 wciśnięty
  portd.0=0                                'zapal diode
  elseif pinb.1=0 then                     'jeżeli przycisk 2 wciśnięty
  portd.0=1                                'zgaś diodę
  endif                                    'koniec bloku warunkowego

loop                                       'koniec pętli

end                                         'koniec programu 

No i działa.

A parę miesięcy temu na tej samej płytce działało wszystko normalnie.

A teraz, jest na odwrót ( te 0 i 1 ). No i właśnie czemu?

Rozumiesz mnie?🙂

Ps. Atmega16, jeśli to coś pomoże.

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Mateusz7764, poprawiłem to zdanie a ty mimo tego, że pokazałem ci różnice pomiędzy tymi dwoma kodami to dalej tego nie rozumiesz. A łopatologiczniej to już się chyba nie da.

W pierwszym kodzie wymusiłeś na wejściach 0, w drugim kodzie wymusiłeś na tych samych wejściach 1. To teraz aby twój kod złapał różnicę to w pierwszym kodzie musisz podać 1 a w drugim 0, po to żeby wymusić zmianę na tym wejściu z jednego stanu na drugi. Stąd obydwa kody działają na innych stanach.

Link do komentarza
Share on other sites

Kurde ja nie wiem czy to ty mnie rozumiesz czy ja cie nie rozumiem. 🙂

Stąd obydwa kody działają na innych stanach.

No właśnie 1 kod który powinien normalnie działać, nie działa.

A 2gi działa.

-----------------------------

Inaczej.

-----------------------------

0 - niema napięcia

1 - jest napięcie

config portd=output       
      portd=&B0000001

Dioda podłączona do ostatniego portu 7 nie świeci.

A podłączając do innych świeci.

No i właśnie dlaczego jeżeli 1 ma napięcie a 0 niema.

A jeżeli zrobie tak:

-----------------------------------

config portd=output       
      portd=&B1111110

Dioda podłączona do ostatniego portu 7 świeci.

A na innych portach nie świeci.

Dlaczego 0 jest postrzegane jako 1 i odwrotnie, że 1 jako 0?

Link do komentarza
Share on other sites

Mateusz7764, zacznij od podstaw elektroniki, czytania i pisania ze zrozumieniem tak aby inni, w tym ja, ciebie zrozumieli.

Po 1, nie do portu 7, tylko do pinu 7 portu d.

Po 2, świecąca dioda, tak jak każda inna dioda jest elementem (nie licząc diody zenera), który przewodzi prąd tylko w jednym kierunku. Jeśli podłączyłeś diodę odwrotnie to normalne, że będzie się świeciła przy innym stanie na wyjściu pinu 7.

Po 3, naucz się podstaw Bascoma bo nie rozumiesz sam jak działa twój kod i gdzie, i kiedy wystawia jakie stany na wyjściach i jak działają wejścia.

Link do komentarza
Share on other sites

No tylko że płytka wygląda tak:

*********************************

jest od And-Tech.pl kupiona za niemałą kase.

i jakieś 2-3 miesiące temu wszystko działało normalnie.

[ Dodano: 10-12-2012, 20:28 ]

To co mam zrobić?

Link do komentarza
Share on other sites

Mateusz7764, naprawdę nie wyrażasz się zrozumiale, ja już nie wiem co ci nie działa a co działa.

Dioda zawsze będzie się świeciła jeśli na jej pin podasz pewnie 1, nie ma nigdzie schematu tej płytki, ale domyślam się, że tak to zostało zrobione. Jeśli podłączyłeś diodę do pinu 7 portu D to nie jest to ostatnia cyfra w tym zapisie:

config portd=output

portd=&B0000001

tylko pierwsza:

portd=&B0000001

Dlatego wydaje ci się, że coś działa inaczej niż ci się wydaje.

W tym zapisie najmłodszy bit portu D, czyli PD0 jest tu portd=&B0000001 a najstarszy czyli PD7 jest tu portd=&B0000001.

Link do komentarza
Share on other sites

$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 16000000                          'definiujemy z jakim taktowaniem będzie pracował


config portb=input                          'port b  jako wejścia
      portb=&B00000000                     'wszędzie stan spoczynkowy-0
config portd=output                         'pprt d jako wyjścia
      portd=&B11111111                      'wszędzie stan spoczynkowy-1 - dioda zapalana jest 0


do                                         'pętla nieskończona
  Set portb.0
  if pinb.0=0 then                         'jeżeli przycisk 1 wciśnięty
  portd.0=0                                'zapal diode
  elseif pinb.1=1 then                     'jeżeli przycisk 2 wciśnięty
  portd.0=1                                'zgaś diodę
  endif                                    'koniec bloku warunkowego

loop                                       'koniec pętli

end                                         'koniec programu

Ten kod powinien zapalać diodę przyciskiem na PB0 i gasić przyciskiem na PB1. Diodę zapala stan 0 (nie 1 tak jak przypuszczałem).

  • Lubię! 1
Link do komentarza
Share on other sites

jest tak jak mówisz że pin7 jest od lewej a pin0 jest od prawej.

Ale wgrałem taki program: ( zrobiłem na porcie c )

$regfile = "m16def.dat"                                    
$crystal = 1000000                                          


   Config Portb = Input                                    
          Portb = &B10000000                               
   Config Portc = Output                                   
          Portc = &B00000001



          End                

i portc. 0 nie świeci a reszta świeci ;/

Link do komentarza
Share on other sites

No właśnie też przeglądnąłem te instrukcje.😉

Także dla tej płytki zapala diode - 0.

Dzięki wielkie za pomoc.

[ Dodano: 10-12-2012, 21:01 ]

a tu :

 if pinb.0=0 then                         'jeżeli przycisk 1 wciśnięty  

nie powinno być:

 if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty 

?🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.