Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 14:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 17 lip 2022, o 15:00 
Offline
Nowy

Dołączył(a): 28 paź 2021
Posty: 6
Pomógł: 0

Witam wszystkich forumowiczów,
Zbudowałem mały projekt na płytce stykowej, gdzie użyłem wyświetlacz 7 segmentowy(anoda), dioda led i chip attiny2313.
Założenie było takie, aby dioda led, migała z daną częstotliwością w tym samym czasie co wyswietlacz.
Wyświetlacz pokazuje cyfry w pętli od 0 do 9 z częstotliwością do 1 sek. Dioda natomiast nie miga, a jest w stanie wysokim - świeci.
Wyświetlacz jest podpięty do całego portu PORTB, dioda natomiast do pinu PD2, gdzie jest również przerwanie INT0.
Próbowałem różnych opcji, gdzie np kabelek od PD2 wpiąłem do PB0 i wtedy dioda migała, ale robiła dwa mignięcia na cały przebieg cyfr to jest od 0....9. I tak w kółko. Wówczas code w ISR nie był brany pod uwagę.

Oto code:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2022, o 16:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

pętla while(1) {} w przerwaniu ?????? To tak jakbyś sobie założył pętlę na szyję a drugą część sznura przywiązał do wysokiej gałęzi i skoczył w dół a później się dziwił dlaczego ci oczy na wierzch wychodzą i jakoś tak duszno się robi ....

sorki ale ten kod w ogóle nie ma prawa działać - przynajmniej to co w pętli głównej

------------------------ [ Dodano po: kilkunastu sekundach ]

poza tym co to za jakieś ustawianie portów, pinów - niestety masakra
avatar12345 napisał(a):
DDRB = 0xff;
PORTB = 0x00;
DDRD = 0x04;
PORTD = 0x04;


------------------------ [ Dodano po: 1 minucie ]

avatar12345 napisał(a):
unsigned char binary_pattern[]

w avr gcc masz do tego prosty typ uint8_t a nie jakieś tam kocie unsigned char

------------------------ [ Dodano po: 2 minutach ]

pomijam już fakt że nigdzie nie ma inicjalizacji dla przerwania INT0

------------------------ [ Dodano po: 3 minutach ]

avatar12345 napisał(a):
cli();

jeśli nigdzie wcześniej w kodzie nie dawałeś sei() to pisanie cli() jest kolejnym nieporozumieniem i w ogóle niepotrzebne

------------------------ [ Dodano po: 4 minutach ]

avatar12345 napisał(a):
for(int i=0; i < 10; i++){


w takiej pętli stosuje się typ uint8_t jeśli zmienna iteracyjna ma zliczać tylko w tak małym zakresie 0-9

------------------------ [ Dodano po: 4 minutach ]

avatar12345 napisał(a):
void Miganie(){
        _delay_ms(1000);
}


jaki sens ma ta funkcja skoro to żadne miganie tylko zwykły delaj - kompletnie niepotrzebna funkcja

------------------------ [ Dodano po: 5 minutach ]

avatar12345 napisał(a):
return 0;


jak masz pętlę główną while to return 0; nigdy nie jest potrzebne

------------------------ [ Dodano po: 6 minutach ]

Ja bym polecił tobie naprawdę zacząć od książki

https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

ona jest stworzona właśnie dla początkujących i nigdy nie pisałbyś w ten sposób programów dzięki niej - polecam - poważnie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2022, o 17:49 
Offline
Nowy

Dołączył(a): 28 paź 2021
Posty: 6
Pomógł: 0

Hej,
Jak wpiszę tak:
DDRB |= 0xff;
PORTB |= 0x00;
Wyświetlacz nie działa
Jak wpiszę tak:
DDRB = 0xff;
PORTB = 0x00
Wyświetlacz działa

Wiele poradników przeczytalem i wiele filmików obejrzałem odnośnie c i avr i nikt nie powiedział, zebym nie stosował 'return 0' jak jest pętla.
Wzrowałem się na pańskim odcinku o przerwaniach na youtubie, na 1 odcinku, pisał pan na tablicy. Inny wektor pan zastosował, bo inny chip. U mnie nie działa, a w tym przykładzie u pana zadziałało?

------------------------ [ Dodano po: 2 minutach ]

[syntax=c//#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>



void Miganie(void){
volatile unsigned int del = 100000;
while(del--);
}

int main(void){


uint8_t binary_pattern[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};

DDRB = 0xff;
PORTB = 0x00;
DDRD |= 0x04;
PORTD |= 0x04;


sei();
while(1){

for(uint8_t i=0; i < 10; i++){

PORTB = binary_pattern[i];
Miganie();

}

}



}

ISR(INT0_vect)
{
static uint8_t i;

i++;
if(i>99){
i=0;

PORTD ^= (1<<PD2);
}


/*
GIMSK |= ((1<<INT0)|(1<<INT0));

MCUCR |= ((1<<ISC01)|(0<<ISC00));
TCNT0 |= ((1<<CS02)|(0<<CS01)|(1<<CS00));
TIMSK |= (1<<OCIE1A);
TCCR0A |= ((1<<COM0A1)|(1<<COM0A0));
*/

}









][/syntax]

------------------------ [ Dodano po: 42 minutach ]

muszę też stwierdzić, że posiada pan w sobie żarty iście z piekła rodem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2022, o 19:14 
Offline
Nowy

Dołączył(a): 28 paź 2021
Posty: 6
Pomógł: 0

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Temat rozwiązany



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 9 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO