Skocz do zawartości

Odwrotne stany spoczynkowe.


Pomocna odpowiedź

Napisano

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.

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.

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.

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

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.

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?

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.

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ć?

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.

$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

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 ;/

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 

?🙂

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...