Powerdown mode w ATmega32A chyba źle robię

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: Powerdown mode w ATmega32A chyba źle robię

Post autor: Michał6201 » 11 maja 2026, 22:29

Z tą poprawką kod działa:
  1. sleep_request = Int_pin
  2. if sleep_request = 1 then  'jesli ni bylo masy i ustawiono flage
Dziękuję :)

Co do tych pinów zasilania w ATMEGA324P to pomyliłem go z ATMEGA324PB, który ma faktycznie inaczej piny ale ma buga i zostało to też opisane na stronie https://avrhelp.mcselec.com/index.html?atmega324pb.htm
I może dlatego taki tani jest :)
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: Powerdown mode w ATmega32A chyba źle robię

Post autor: Michał6201 » 13 maja 2026, 22:55

Mam jeszcze jedno może głupie pytanie odnośnie tego fragmentu kodu, który mi dałeś:
  1. PCMSK3 = &B0000_0100  'aktywny tylko PD2
  2.       Enable PCINT3 : On PCINT3 Pcint3_isr
  3.       ACC alias pind.2 : set portd.2
Dlaczego PCINT3, skoro w ATMEGA324P pin P2 czyli do INT0 przypisany jest PCINT26 według noty tego mikrokontrolera.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Powerdown mode w ATmega32A chyba źle robię

Post autor: niveasoft » 13 maja 2026, 23:34

W starych Atmegach były tylko przerwania na wybranych pinach i się nazywają INT0, INT1, INT2 ...
W tych nowych Atmegach dołożyli nowy hardware i prawie każda noga w procesorze może byc przerwaniem zewnętrznym tylko one są powiązane portami.
Opisałem to lata temu tutaj https://bart-projects.pl/pcint.html tylko to było chyba dla 328P ktora ma tylko trzy porty. Musiałbym ten artykuł kiedyś uaktualnić o to skąd najłatwiej wyciągać który to PCINT.
Najłatwiej jest otworzyć plik DAT dla procesora w Bascom.
U Ciebie PCINT26 należy do PCMSK3 czyli już czwartego portu.

Ludzie często na początku nie rozumiejąc zasady próbują włączyć Enable PCINT26 a takiego nie ma :lol:
Trzeba to zrozumieć. W razie czego jak po lekturze strony nie zrozumiesz to pisz a ja postaram się wyjaśnić to jeszcze bardziej i wtedy uaktualnię ten opis na mojej stronie.

No i jak na końcu masz noge PD2 to masz wybór czy wykorzystujesz klasyczny INT0 albo PCINT bo oba sa na tej nodze.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: Powerdown mode w ATmega32A chyba źle robię

Post autor: Michał6201 » 18 maja 2026, 22:42

I nie rozumiem po części, bo mi się nie zgadza, to co jest w tym programie moim z tym co piszesz i jest w datascheet atmega324pa. A program działa poprawnie, więc wszystko mi się wyklucza, bo nie powinien działać według tego co tu widzę. Ale pewnie jak zwykle nie rozumiem datascheeta.

Według datascheet PCINT26 należy do maski PCMSK3 jest to bit3. Natomiast PCINT3 należy do maski PCMSK0 i jest to bit4.

A w programie mam zapis: PCMSK3 = &B0000_0100 (czyli bit 3), a pod spodem zapis: ENABLE PCINT3. Czyli ma się to nijak do datascheet.

Rozumiem, że te porty liczy się tak, że PCMSK0 to port 1, PCMSK1 to port 2 ... PCMSK3 to port 4.
A port 1, to który? PA, PB, PC, PD? Port 1 to będzie PA, a port 4 to PD. Tak na logikę mi się wydaje :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Powerdown mode w ATmega32A chyba źle robię

Post autor: niveasoft » 19 maja 2026, 6:05

Po pierwsze PCINT3 w PCMSK0 to bit 3 bo liczymy od zera czyli PCINT0 to bit 0.

Po drugie na poprzednio zamieszczonym przeze mnie screenie masz pinout. To nieskomplikowane spojrzeć.
PCINT0-PCINT7 to PORTA i PCMSK0
PCINT8-PCINT15 to PORTB i PCMSK1
PCINT16-PCINT23 to PORTC i PCMSK2
PCINT24-PCINT31 to PORTD i PCMSK3

Wszystko jest zebrane w plikach DAT Bascoma.
Otwierasz plik m644PAdef.dat i masz:

; ***** EXTERNAL_INTERRUPT ***********
; EICRA - External Interrupt Control Register A
ISC00 = 0 ; External Interrupt Sense Control Bit
ISC01 = 1 ; External Interrupt Sense Control Bit
ISC10 = 2 ; External Interrupt Sense Control Bit
ISC11 = 3 ; External Interrupt Sense Control Bit
ISC20 = 4 ; External Interrupt Sense Control Bit
ISC21 = 5 ; External Interrupt Sense Control Bit

; EIMSK - External Interrupt Mask Register
INT0 = 0 ; External Interrupt Request 0 Enable
INT1 = 1 ; External Interrupt Request 1 Enable
INT2 = 2 ; External Interrupt Request 2 Enable

; EIFR - External Interrupt Flag Register
INTF0 = 0 ; External Interrupt Flag 0
INTF1 = 1 ; External Interrupt Flag 1
INTF2 = 2 ; External Interrupt Flag 2

; PCICR - Pin Change Interrupt Control Register
PCIE0 = 0 ; Pin Change Interrupt Enable 0
PCIE1 = 1 ; Pin Change Interrupt Enable 1
PCIE2 = 2 ; Pin Change Interrupt Enable 2
PCIE3 = 3 ; Pin Change Interrupt Enable 3

; PCIFR - Pin Change Interrupt Flag Register
PCIF0 = 0 ; Pin Change Interrupt Flag 0
PCIF1 = 1 ; Pin Change Interrupt Flag 1
PCIF2 = 2 ; Pin Change Interrupt Flag 2
PCIF3 = 3 ; Pin Change Interrupt Flag 3

; PCMSK3 - Pin Change Mask Register 3
PCINT24 = 0 ; Pin Change Enable Mask 24
PCINT25 = 1 ; Pin Change Enable Mask 25
PCINT26 = 2 ; Pin Change Enable Mask 26
PCINT27 = 3 ; Pin Change Enable Mask 27
PCINT28 = 4 ; Pin Change Enable Mask 28
PCINT29 = 5 ; Pin Change Enable Mask 29
PCINT30 = 6 ; Pin Change Enable Mask 30
PCINT31 = 7 ; Pin Change Enable Mask 31

; PCMSK2 - Pin Change Mask Register 2
PCINT16 = 0 ; Pin Change Enable Mask 16
PCINT17 = 1 ; Pin Change Enable Mask 17
PCINT18 = 2 ; Pin Change Enable Mask 18
PCINT19 = 3 ; Pin Change Enable Mask 19
PCINT20 = 4 ; Pin Change Enable Mask 20
PCINT21 = 5 ; Pin Change Enable Mask 21
PCINT22 = 6 ; Pin Change Enable Mask 22
PCINT23 = 7 ; Pin Change Enable Mask 23

; PCMSK1 - Pin Change Mask Register 1
PCINT8 = 0 ; Pin Change Enable Mask 8
PCINT9 = 1 ; Pin Change Enable Mask 9
PCINT10 = 2 ; Pin Change Enable Mask 10
PCINT11 = 3 ; Pin Change Enable Mask 11
PCINT12 = 4 ; Pin Change Enable Mask 12
PCINT13 = 5 ; Pin Change Enable Mask 13
PCINT14 = 6 ; Pin Change Enable Mask 14
PCINT15 = 7 ; Pin Change Enable Mask 15

; PCMSK0 - Pin Change Mask Register 0
PCINT0 = 0 ; Pin Change Enable Mask 0
PCINT1 = 1 ; Pin Change Enable Mask 1
PCINT2 = 2 ; Pin Change Enable Mask 2
PCINT3 = 3 ; Pin Change Enable Mask 3
PCINT4 = 4 ; Pin Change Enable Mask 4
PCINT5 = 5 ; Pin Change Enable Mask 5
PCINT6 = 6 ; Pin Change Enable Mask 6
PCINT7 = 7 ; Pin Change Enable Mask 7



Widać że ta Atmega ma trzy zwykłe przerwania zewnętrzne INT0-INT2 włączane w rejestrze EIMSK i cztery przerwania typu Pin Change PCIE0-PCIE3 włączane w rejestrze PCICR.

Jeśli chciałbyś włączyć przerwanie PCIE3 na rejestrach to by trzeba napisać
  1. PCICR.PCIE3 = 1
I to robi polecenie
  1. Enable PCINT3

To jest po prostu składnia Bascoma. Moze powinni to opisać inaczej na przykład Enable PCIE3, ale jest tak a nie inaczej i tylko tyle.
ODPOWIEDZ