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



Teraz jest 2 mar 2026, o 20:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 12 sty 2014, o 20:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Mam problem, część diod którymi steruję znalazły sie w innym rejestrze, co widac na załączonej poniżej bibliotece. chciałbym w jakiś prosty sposób używać wszystkich diod, tylko problem pojawia sie gdy musze zmienić rejestr, wtedy jakies dziwne kombinacje robić, czy tak jak poniżej definiować rejestr D pod inna nazwą. czy da sie to jakoś zautomatyzować i używając odpowiedniej diody zmieniał się odpowiedni port ?

Matryca jest wykonana według schematu tylko odpowiednio 5 wierszy i 7 kolumn

Obrazek

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


plik *.h

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


main.c

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


W powyzszym przykładzie jest problem, gdyz zapalają mi sie dodatkowo piksele 3x2 i 3x3 ... tez w sumie nie wiem czemu. Pojedyncze użycie fukcji setpixel ustawia odpowiedni piksel, oczywoscie w zakresie gdy nie uzywam diod z rejestru D



Ostatnio edytowano 12 sty 2014, o 23:57 przez Atmegowiec, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2014, o 20:29 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Czy wszystko kompiluje Ci się bez problemów? ;-)
Funkcje array... i setpixel zwracają wartość a nigdzie jej nie przypisujesz.
Zadeklaruj i zdefiniuj je jako void i wyrzuć return 0;
Makra np PB1, PB2 itd... w swoim rozwinięciu zwracają liczby czyli tu 1, 2
A KOLPORT to port B dlatego niezależnie jakie wartości wpiszesz będą zapalać się tylko
diody podłączone do portu B

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

A o jakich dziwnych kombinacjach piszesz?
Skoro masz tak podłączone to:
w funkcji setpixel sprawdzasz którą diodę chcesz zapalić zwykły IF
i w zależności od tego wybierasz albo KOLPORT albo KOLPORT1

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2014, o 20:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

MirkoT napisał(a):
Czy wszystko kompiluje Ci się bez problemów? ;-)
Funkcje array... i setpixel zwracają wartość a nigdzie jej nie przypisujesz.
Zadeklaruj i zdefiniuj je jako void i wyrzuć return 0;


Nie ma warringów ani innych problemów

MirkoT napisał(a):
Skoro masz tak podłączone to:
w funkcji setpixel sprawdzasz którą diodę chcesz zapalić zwykły IF
i w zależności od tego wybierasz albo KOLPORT albo KOLPORT1

Dobry pomysł!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2014, o 23:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

mam takie pytanie jeszcze, jak sprawić by wyswietlał sie tylko dany punkt ? bo jesli uzyje programu tak jak powyzej to zapalone kolumny w wczesniejszym poleceniu subpixel, dodają sie do kolejnych wierszy co powoduje ze są dodatkowe punkty w danej kolumnie

Jak zamaskowac, by tylko te punkty sie pokazywały? W Mirka ksiązce owszem jest napisane o maskowaniu lecz Mirek tam ma z góry okreslone bity które maskuje "0xF0" a ja przecież nie wiem jakie punkty wyswietlą się



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 07:33 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Atmegowiec napisał(a):
mam takie pytanie jeszcze, jak sprawić by wyswietlał sie tylko dany punkt ? bo jesli uzyje programu tak jak powyzej to zapalone kolumny w wczesniejszym poleceniu subpixel, dodają sie do kolejnych wierszy co powoduje ze są dodatkowe punkty w danej kolumnie

Jak zamaskowac, by tylko te punkty sie pokazywały? W Mirka ksiązce owszem jest napisane o maskowaniu lecz Mirek tam ma z góry okreslone bity które maskuje "0xF0" a ja przecież nie wiem jakie punkty wyswietlą się

skoro w funkcji setpixel() masz or "|=" no to znaczy, że do poprzednio zapalonych pikseli dodajesz
następne.
Jeżeli chcesz mieć tylko nowe to poprzednie musisz "zgasić"

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 18:31 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Źle podchodzisz do tematu. Marnujesz pamięć RAM na przechowywanie stałych. Należy zdefiniować sobie tablicę która będzie zawierać to co ma być wyświetlane. Obsługa wyświetlacza wykorzystująca timer powinna stale przepisywać zawartość tablicy na wyświetlacz używając multipleksowania, czyli w danej milisekundzie świeci się 1 kolumna, a w kolejnej następna tak samo jak są sterowane wyświetlacze 7-segmentowe na zestawie ATB.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Cytuj:
Źle podchodzisz do tematu. Marnujesz pamięć RAM na przechowywanie stałych. Należy zdefiniować sobie tablicę która będzie zawierać to co ma być wyświetlane. Obsługa wyświetlacza wykorzystująca timer powinna stale przepisywać zawartość tablicy na wyświetlacz używając multipleksowania, czyli w danej milisekundzie świeci się 1 kolumna, a w kolejnej następna tak samo jak są sterowane wyświetlacze 7-segmentowe na zestawie ATB.


Wczoraj z jednym z uzytkowników doszedłem do tego samego wniosku by uzyc multipleksowania, dlatego opierając sie na BB skonfigurowałem timer, i proceduje przerwania. Kod wstawiam ponizej. nie wiem dokonca czemu eclipse przy kompilacji wyrzuca taki warring:

Kod:
Building file: ../matryca.c
Invoking: AVR Compiler
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF"matryca.d" -MT"matryca.d" -c -o "matryca.o" "../matryca.c"
../matryca.c:31:1: warning: return type defaults to 'int'
../matryca.c: In function 'ISR':
../matryca.c:31:1: warning: type of '__vector_3' defaults to 'int'
../matryca.c:45:1: warning: control reaches end of non-void function
Finished building: ../matryca.c
 
Building target: tablice.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,tablice.map -mmcu=atmega8 -o "tablice.elf"  ./LCD/lcd44780.o  ./main.o ./matryca.o   
./matryca.o: In function `ISR':
matryca.c:(.text+0x2c): undefined reference to `wiersz1'
matryca.c:(.text+0x36): undefined reference to `wiersz2'
matryca.c:(.text+0x40): undefined reference to `wiersz3'
matryca.c:(.text+0x4a): undefined reference to `wiersz4'
matryca.c:(.text+0x54): undefined reference to `wiersz5'
collect2: ld returned 1 exit status
make: *** [tablice.elf] Error 1


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


"wiersz1" itd to tylko tak na chwile, zeby zobaczyc ogół, w pozniejszym czasie bedą tam odwałania do tablicy, nad która teraz myslę jak zorganizować. Mam matryce 5x7 czyli 5 wierszy i 7 kolumn. Chce sterować wierszami, gdyz jest ich mniej :). Jak mozna zorganizować tablicę, by łatwo mozna było zmieniaj jej zawartosc? np w danym miejscu w tablicy umiescic "1" by zapalił sie dany punkt ?, a potem "ifami": sprawdzac czy danelement jest "1" i wtedy odnosi sie do innej tablicy zawierającej w danym miejscu fragment typu PORTX |= (1<<X1) ?

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



Ostatnio edytowano 13 sty 2014, o 21:52 przez Atmegowiec, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 21:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Jeśli chodzi o błąd to wygląda na to ,że nie masz tych zmiennych zadeklarowanych
lub nie dołączyłeś pliku z deklaracjami



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 21:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Zaba napisał(a):
Jeśli chodzi o błąd to wygląda na to ,że nie masz tych zmiennych zadeklarowanych
lub nie dołączyłeś pliku z deklaracjami


zadeklarowałem zmienna w pliku nagłówkowym który dołączyłem poprzez include "matryca.h"
Czego może dotyczyć warring:

Kod:
matryca.c:31:1: warning: return type defaults to 'int'
../matryca.c: In function 'ISR':
../matryca.c:31:1: warning: type of '__vector_3' defaults to 'int'
../matryca.c:45:1: warning: control reaches end of non-void function


i stawia warring przy nawiasach klamrowych w przerwaniu

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: 13 sty 2014, o 22:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Co masz w linii wcześniejszej przed makrem ISR
może zrób Clean projektu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2014, o 22:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

mam rozpisane inne funkcje realizowane w programie

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: 13 sty 2014, o 22:38 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Atmegowiec napisał(a):
Czego może dotyczyć warring:

Kod:
matryca.c:31:1: warning: return type defaults to 'int'
../matryca.c: In function 'ISR':
../matryca.c:31:1: warning: type of '__vector_3' defaults to 'int'
../matryca.c:45:1: warning: control reaches end of non-void function

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


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 17:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Hmm, chciałbym wrócić do multipleksowania, i może dokładniej zilustruje mój problem (kolejny). Docelowo wprowadzam multipleksowanie by wyświetlać na matrycy kilka punktów,bez dodatkowych "errorów czyli zapalen innych punktów niz te które mają się wyświetlać.

Mój obecny kod w pętli głównej wygląda tak:

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


plik matryca.c z opisem poszczególnych funkcji i multipleksowaniem:

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


Plik nagłówkowy matryca.h:

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




Problem jest taki ze dalej zapalają sie dodatkowe punkty, czy moglibyscie sprawdzic procedure multiplkeksowanie i ogolnie kod, co jest zle.. bo ja juz wymiekam..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2014, o 21:58 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A czy próbowałeś wpisywać inne wartości kolumny i wiersza?
Poza tym to wywołujesz setpixel() z częstotliwością obiegu pętli głównej
i nijak się to ma do tego co robisz w przerwaniu ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 00:11 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Szedłeś w dobrym kierunku, ale zgubiłeś tablicę uint8_t matryca[5][7], która oczywiście jest za duża. Zdefiniuj sobie taką tablicę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

funkcja set_pixel powinna operować na tej tablicy wprost bez żądnych udziwnień:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

przykładowo wywołanie takiej funkcji 2 razy jak tam wyżej pisałeś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Spowoduje zmianę w tej tablicy matryca i będzie o na wyglądać tak (chyba ;) )
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I w pętli głównej sobie dowolnie zmieniasz tą tablicę np. przewijasz tam teksty czy wyświetlasz grafikę
W przerwaniu rzutujesz tą tablicę na wyświetlacz. Tu może być skomplikowanie, bo to później cię nie interesuje.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 13:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 gru 2012
Posty: 729
Lokalizacja: Białystok
Pomógł: 12

Atmega, rozmwialiśmy o tym na czacie. Masz problem z funkcją narastający();
W funkcji masz linijkę którą przesuwasz wiersze: WPORT &= ~(wiersze[z]);
No ale przesuwaniami wierszy ma zająć się multipleksowanie. Dlatego u Ciebie program nie działa odpowiednio.
Założeniem jest to że gdy stan wysoki jest na wierszu 1 to zapalają się diody w kolumnie 1.
Musisz więc zrobić to tak, że następuje multipleks i gdy jest ten wiersz 1 to zapalają się diody w 1 kolumnie.
Można całą operację wwalić do przerwania, ale ja bym to zrobił w pętli, a dokładniej w funkcji. Sprawdzasz if'em czy jest stan wysoki na wierszu 1 i zapalasz 1 kolumnę. Gotowca nie dam, ale podpowiem że może się przydać zmienna licznik jako zmienna globalna ;)

Jeśli coś żem źle przedstawił to proszę o naprostowanie ;)

Pozdr

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

nic nie moge wymyslic, cały czas mam w głowie jedno rozwiazanie te ktore mam obecnie w kodzie czyli reczne zapalanie wiersza, bo jak inaczej? wydaje mi sie ze inaczej to strasznie zagmatwa kod jak juz,

no poprostu nei wiem, moze jakis przykład?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2014, o 22:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 gru 2012
Posty: 729
Lokalizacja: Białystok
Pomógł: 12

To jeszcze inaczej podpowiem. Jesli licznik bedzie zmienna globalna, to bedziesz mogl sie odwolac do niej w funckji narastanie.
Podpowiem jedna linijke kodu :)
if (licznik==0) zapal kolumne 1
I musisz zrobic 5 ifow (zaleznie od ilosci wierszy) .
Z takim kodem wiersze beda sie zmienialy szybko, a nawet bardzo szybko :P
To jest taki troche ulomny sposob i warto pomyslec nad czyms lepszym np. napisac zamiast tego KOLPORT |= kolumny[z]; to KOLPORT |= kolumny[licznik]; I obeszlo sie bez ifow, ale teraz musisz pomyslec nad tym, aby wszystko odbywalo sie wolniej.
Ja to tak widze, a z checia zobaczylbym jakis inny sposob ;)

Edit:
Zliczaj 200ms ale uzywając przerwania :>

_________________
sig off ;(



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: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO