Fórum témák
- • Sprint-Layout NYÁK-tervező
- • Napelem alkalmazása a lakás energia ellátásában
- • VF2 végerősítő
- • Hörmann kapuk
- • Videomagnó problémák
- • Számítógép hiba, de mi a probléma?
- • PIC programozás assemblyben
- • PROM (TBP18S030N)
- • NYÁK-tervező programok
- • Mikrovezérlős cambus-os izzító relé
- • Mosogatógép hiba
- • Fejhallgató erősítő
- • Szárítógép problémák
- • Vásárlás, hol kapható?
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Oszcilloszkóp vétel, mit gondoltok?
- • Kazettás magnó (deck) javítása
- • Vicces - mókás történetek
- • Kapcsolóüzemű táp 230V-ról
- • Arduino
- • Oszcilloszkóp, avagy hogyan kell használni?
- • Kutya macska (vad) riasztó
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Hegesztő inverter javítás
- • FET vezérlése
- • Érdekességek
- • Erősítő mindig és mindig
- • Lézer érzékelő
- • Indukciós főzőlap, sütő bekötése, kábelek kiépítése
- • Áramlökés határoló lágyindító
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • Hibrid erősítő
- • Egyfázisú villanymotor fordulatszám szabályozása
- • Transzformátor készítés, méretezés
- • IMI villanymotor
- • Műhelyünk felszerelése, szerszámai
- • Robotfűnyíró vagy fűnyíró robot
- • Kombikazán működési hiba
- • Villanyszerelés
- • Rádiótechnika számok keresése
- • Porszívó javítás
- • Rendelés külföldről (eBay - Paypal)
- • Szobatermosztát bekötése
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Klíma beszerelése, fűtés-hűtés házilag
- • Hűtőgép probléma
- • Muzeális készülékek-alkatrészek restaurálása
- • Toroid transzformátor
- • LCD TV probléma
- • Elektromos távirányítós kapunyitó
- • SMD forrasztás profin
- • CNC építése házi alkatrészekből az alapoktól
- • Ki hol gyártatja a NYÁK-ot ?
- • Felajánlás, azaz ingyen elvihető
- • HESTORE.hu
» Több friss téma
|
Fórum » AVR - Miértek hogyanok
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Szia mindenkinek!
Eléggé kezdő vagyok. Kérdésem: az *.ASM file-ből hogy lehet HEX filé-t készíteni az AtmelStudió, vagy a CodeVision programban. Köszönöm!
Sziasztok!
ATMega48PA-PU-val szeretnék egy akkumulátoros fúrógépből kiszerelt motort ( 12V-os) vezérelni. Ehhez egy IRLZ34N MOSFET-et használnék. A probléma az, hogy ha a PWM kitöltési tényezője kevesebb, mint 100%, akkor a motor megmozdul, de nem pörög föl.
TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00);
TCCR0B = (1 << CS01) | (1 << CS00);
Ha minden igaz, akkor így fázishelyes módban, 64-es előosztással megy az időzítő. A CPU 8MHz. A MOSFET-hez csatlakozó láb kimenet. Ha a kitöltés 100% (vagy sima I/O lábként próbálom, PWM nélkül), akkor gond nélkül megy a motor, a MOSFET nem melegszik egyáltalán.
A kapcsolás valahogy így néz ki. Lehet, hogy a 270 Ohmos ellenállás túl nagy, és ezért a MOSFET nem kapcsol be elég gyorsan? A hozzászólás módosítva: Jan 15, 2017
Sziasztok!
Építettem egy 7X8 RGB led mátrixot egy ATmega8-al és terveztem rá egy animációt.
Videó : ITT.
A probléma az, hogy az első piros sor(a kódban red[0]) értéke végig nulla marad. Pedig annak is fel kéne töltödnie 1-255-ig.
Akárhogy törtem a fejem nem találtam meg a hibát. A legmegdöbbentőbb az, hogy ha csak az animáció felét(mármint csak a feltöltődés efektust) rakom a végtelen ciklusba, akkor működik az első sor is.
A multiplexezés a 8 bites Timer2 interruptjában fut, azzal nincs gond, tökéletesen működik. Valahol a végtelen ciklusban lehet a hiba.
while(1)
{
unsigned char s=1;
while(s)
{
red[0]=s;
if(s>=7)
{
if(s==7) green[1]=(1);
if(s>7)
{
if(green[1]<255) green[1]=(2*green[1]+1);
if(green[1]==7) blue[2]=1;
if(green[1]>7)
{
if(blue[2]<255) blue[2]=(2*blue[2]+1);
if(blue[2]==7) red[3]=1;
if(blue[2]>7)
{
if(red[3]<255) red[3]=(2*red[3]+1);
if(red[3]==7) green[4]=1;
if(red[3]>7)
{
if(green[4]<255) green[4]=(2*green[4]+1);
if(green[4]==7) blue[5]=1;
if(green[4]>7)
{
if(blue[5]<255) blue[5]=(2*blue[5]+1);
if(blue[5]==7) red[6]=1;
if(blue[5]>7)
{
red[6]=(2*red[6]+1);
}
}
}
}
}
}
}
_delay_ms(100);
if(s<255) s=(2*s+1);
if(red[6]==255)
{
_delay_ms(100);
break;
}
}
//**************************************************************************
s=127;
while(1)
{
red[0]=s;
if(s<=63)
{
if(s==63) green[1]=127;
if(s<63)
{
green[1]=((green[1]-1)/2);
if(green[1]==63) blue[2]=127;
if(green[1]<63)
{
blue[2]=((blue[2]-1)/2);
if(blue[2]==63) red[3]=127;
if(blue[2]<63)
{
red[3]=((red[3]-1)/2);
if(red[3]==63) green[4]=127;
if(red[3]<63)
{
green[4]=((green[4]-1)/2);
if(green[4]==63) blue[5]=127;
if(green[4]<63)
{
blue[5]=((blue[5]-1)/2);
if(blue[5]==63) red[6]=127;
if(blue[5]<63)
{
red[6]=((red[6]-1)/2);
}
}
}
}
}
}
}
_delay_ms(100);
if(s>0) s=((s-1)/2);
if(red[6]==0)
{
_delay_ms(100);
break;
}
}
}
Szinte biztos vagyok benne, hogy a nálam tapasztaltabbak százszor egyszerűbben is meg tudnák írni az animációt, de én csak erre jutottam
Esetleg valami ötlet, hogy mi lehet a hiba?
Elnézést, az előző kód miatt, elég rosszul sikerült a beillesztése. Itt az új:
while(1)
{
unsigned char s=1;
while(s)
{
red[0]=s;
if(s>=7)
{
if(s==7) green[1]=(1);
if(s>7)
{
if(green[1]<255) green[1]=(2*green[1]+1);
if(green[1]==7) blue[2]=1;
if(green[1]>7)
{
if(blue[2]<255) blue[2]=(2*blue[2]+1);
if(blue[2]==7) red[3]=1;
if(blue[2]>7)
{
if(red[3]<255) red[3]=(2*red[3]+1);
if(red[3]==7) green[4]=1;
if(red[3]>7)
{
if(green[4]<255) green[4]=(2*green[4]+1);
if(green[4]==7) blue[5]=1;
if(green[4]>7)
{
if(blue[5]<255) blue[5]=(2*blue[5]+1);
if(blue[5]==7) red[6]=1;
if(blue[5]>7)
{
red[6]=(2*red[6]+1);
}
}
}
}
}
}
}
_delay_ms(100);
if(s<255) s=(2*s+1);
if(red[6]==255)
{
_delay_ms(100);
break;
}
}
//***************************************************************************
s=127;
while(1)
{
red[0]=s;
if(s<=63)
{
if(s==63) green[1]=127;
if(s<63)
{
green[1]=((green[1]-1)/2);
if(green[1]==63) blue[2]=127;
if(green[1]<63)
{
blue[2]=((blue[2]-1)/2);
if(blue[2]==63) red[3]=127;
if(blue[2]<63)
{
red[3]=((red[3]-1)/2);
if(red[3]==63) green[4]=127;
if(red[3]<63)
{
green[4]=((green[4]-1)/2);
if(green[4]==63) blue[5]=127;
if(green[4]<63)
{
blue[5]=((blue[5]-1)/2);
if(blue[5]==63) red[6]=127;
if(blue[5]<63)
{
red[6]=((red[6]-1)/2);
}
}
}
}
}
}
}
_delay_ms(100);
if(s>0) s=((s-1)/2);
if(red[6]==0)
{
_delay_ms(100);
break;
}
}
}
Köszönöm a segítségeteket!
Paritás,stop bitek rendben voltak, de az órajel nem..
Nem módosítottam fuse biteket, nem használok külső oszcillátort.
Most működik, de még kellett egy kis módosítás az általad említetteken kívül:
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 8UL)) - 1) // UBRR
A 8-as osztást ki lehet kapcsolni fuse bitek módosításával?
Persze akkor F_CPU-t is át kell írni gondolom.
Igen ki lehet kapcsolni a fuse bitekkel.
Másik megoldás, hogy a kódba irod be a kikapcsolást.
Ezt beirod a kódod legelejére és igy 8Mhzen fog menni.
Egy debug javaslat, ezt:
cseréld le erre:
Ha egyik fény sem fut, akkor valóban a red[0] változóval van a baj. Ha mégis lefut, akkor valahol máshol a megjelenitésben.
Igen jól gondolod, viszont ezt a cikket olvasd el mielőtt belevágsz: Bővebben: Link. Másik hasznos dolog a fusebit doctor, néhány oldallal korábban adtam rá linket.
Köszi, a javaslatot. Kipróbáltam és semmi változás. Tehát az már biztos, hogy a red[0] értéke az folyamatosan növelődik. Valahol máshol lehet a hiba. Kipróbáltam, hogy a csökkenő részt kivettem az animációból: ha az összes feltöltődött, akkor lenullázódnak és újra kezdődik a feltöltődés. Na ott működik mindegyik oszlop. Fogalmam sincs, mi lehet a hiba.
Üdv!
Open-suse alatt próbálkozok az avr-gcc -vel de sikertelenül.
A követketző hibát kapom mindíg:
> avr-gcc -o thb. elf -mmcu= atmega128 main. o serial. o ...
/usr/bin/avr-ld: warning: -z relro ignored.
/usr/bin/avr-ld: cannot find -lm
/usr/bin/avr-ld: cannot find -lc
collect2: error: ld returned 1 exit status
>
Valaki tud esetleg megoldást erre?
Illetve ha valaki tud küldeni egy AVR C forrásfájlokat HEX-re fordító minta makefile-t ami működőképes, azt örömmel fogadnám! (Lehet abban van a hiba?)
Előre is köszönettel!
B.
Összedobtam két másik megközelítést a ciklusodhoz, hátha némi inspirációval szolgálnak.
MCU után kell megadni az avr tipusát
F_CPU után az órajelet (érdemes ezt használni kódban is, pl.: c=8000000/8; helyett c=F_CPU/8; )
MODULES után ha a főprogramon kívül használsz modulokat
LIBS után ha használsz lib-eket
AVRDUDE, PORT és PROGRAMMER-t beállíthatod, ha make-el akarsz írni is (persze a programozódhoz)
CFLAGS és LDFLAGS bővítheted, ha szükséges
A HEADER alá bele teszi az összes könyvtárban lévő fejléc file-okat.
Azt feltételezi, hogy a főprogram a main.c-ben van.
használat
fordítás:
takarít:
kiírja a programod és az eeprom méretét (hasznos lehet, ha épp belefér/nem fér bele méret körül vagy)
felprogramozza az MCU-t
eeprom-ot felprogramozza (ha használsz):
Makefile:
## avr tipusa
## avr orajele
F_CPU = 8000000
## modulok
MODULES = serial.o
## libek
LIBS=-lm
## programozo
AVRDUDE = avrdude
## programozo portja
PORT = avrdoper
## porgramozo tipusa
PROGRAMMER = stk500v2
## c fordito
CC=avr-gcc
## c linker
LD=avr-gcc
## ihex
GENHEX=avr-objcopy
## fordito kapcsoloi
CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU)
CFLAGS += -I.
CFLAGS += -Wall -Os
LDFLAGS =
LDFLAGS += $(LIBS)
HEXFLAGS=-j .text -O ihex
EEPFLAGS=-j .eeprom --change-section-lma .eeprom=0 -O ihex
HEX = main.hex
EEP = main.eep
OBJS = main.o $(MODULES)
HEADERS = $(wildcard *.h)
ALL = $(HEX) $(EEP)
all: $(ALL)
clean:
@rm -f $(OBJS) $(ALL)
%.o: %.c Makefile $(HEADERS)
$(CC) -c $< -o $@ $(CFLAGS)
%.bin: $(OBJS)
$(LD) -o $@ $(OBJS) $(LDFLAGS)
%.hex: %.bin
$(GENHEX) $(HEXFLAGS) $< $@
%.eep: %.bin
$(GENHEX) $(EEPFLAGS) $< $@
writeflash: $(HEX)
$(AVRDUDE) -p $(MCU) -F -c $(PROGRAMMER) -P $(PORT) -U flash:w:$(HEX)
writeeeprom: $(EEP)
$(AVRDUDE) -p $(MCU) -F -c $(PROGRAMMER) -P $(PORT) -U eeprom:w:$(EEP)
size:
avr-size -d $(HEX) $(EEP)
A hozzászólás módosítva: Jan 16, 2017
Köszönöm szépen a kód javaslatokat  Amint lesz egy kis időm, ki is próbálom. A második kód hasonlított ahhoz amivel én próbálkoztam, ezért ugye könnyebb volt megérteni számomra. Az első viszont nagyon elegáns, mivel rövid és teljesen automatizált.
Eléggé kezdő vagyok még a programozásban, sokat kell még tanulnom Ez a sor például nem jutott volna eszembe, pedig teljesen logikus:sorok[0] += (sorok[0] + 1)
A hiba valószínűleg az elején levő értékadás: unsigned char s=1;
Amit a programod végén indokoltam.
while(1)
{
unsigned char s=1;
while(s)
{
red[0]=s;
if(s>=7)
{
if(s==7) green[1]=(1);
if(s>7)
{
if(green[1]<255) green[1]=(2*green[1]+1);
if(green[1]==7) blue[2]=1;
if(green[1]>7)
{
if(blue[2]<255) blue[2]=(2*blue[2]+1);
if(blue[2]==7) red[3]=1;
if(blue[2]>7)
{
if(red[3]<255) red[3]=(2*red[3]+1);
if(red[3]==7) green[4]=1;
if(red[3]>7)
{
if(green[4]<255) green[4]=(2*green[4]+1);
if(green[4]==7) blue[5]=1;
if(green[4]>7)
{
if(blue[5]<255) blue[5]=(2*blue[5]+1);
if(blue[5]==7) red[6]=1;
if(blue[5]>7)
{
red[6]=(2*red[6]+1);
}
}
}
}
}
}
}
_delay_ms(100);
if(s<255) s=(2*s+1);
if(red[6]==255)
{
_delay_ms(100);
break;
}
}
//***************************************************************************
s=127;
while(1)
{
red[0]=s;
if(s<=63)
{
if(s==63) green[1]=127;
if(s<63)
{
green[1]=((green[1]-1)/2);
if(green[1]==63) blue[2]=127;
if(green[1]<63)
{
blue[2]=((blue[2]-1)/2);
if(blue[2]==63) red[3]=127;
if(blue[2]<63)
{
red[3]=((red[3]-1)/2);
if(red[3]==63) green[4]=127;
if(red[3]<63)
{
green[4]=((green[4]-1)/2);
if(green[4]==63) blue[5]=127;
if(green[4]<63)
{
blue[5]=((blue[5]-1)/2);
if(blue[5]==63) red[6]=127;
if(blue[5]<63)
{
red[6]=((red[6]-1)/2);
}
}
}
}
}
}
}
_delay_ms(100);
if(s>0) s=((s-1)/2);
if(red[6]==0)
{
_delay_ms(100);
break; // mikor itt kilépsz a while böl! A ciklus elején s = 1 Lesz!
}
}
}
A hozzászólás módosítva: Jan 17, 2017
Sziasztok!
Ha postán feladnék egy ATMega kontrollert válaszborítékkal, postaköltséggel együtt, akkor megtenné nekem valaki, hogy felprogramozza? A segítség csak abban a formában jó, ha nem Arduino ISP-s programozással van megoldva.
Segítségeiteket előre is köszönöm, privátban üzenetben jelezzetek, ha tudtok. Köszönöm!
MŰKÖDIK!  Köszönöm segítségedet! Plusz öröm, hogy ennek segítségével sikerült megtalálni azt is, hogy amivel eddig próbálkoztam, az miért könyökölt ki mindig a gépházból.
Csak kíváncsi vagyok, hogy az ArduinoISP miért nem jó?
Arra én is. Az IC-t ugyan nem érdekli mi programozta fel.
Bocsi, de ezt nem értem. Miért baj az, hogy miután kilépek a második while-ból, akkor egy lesz a változó értéke? Ez miben befolyásolja azt, hogy az első oszlop egyáltalán nem világít? Hiszen amikor kilépek a második while ciklusból, egy lesz az értéke a változónak és indul az elejéről a feltöltődésért felelős ciklus (első while) aminek úgy kéne kezdődnie, hogy az első oszlop első ledje világít (red[0]=1). A hozzászólás módosítva: Jan 18, 2017
„első oszlop első ledje világít (red[0]=1).”
Az nem elég, hogy a változóknak adsz értékeket!
Ezeket az értékeket még ki kellene küldeni a megfelelő portokra is!
Hogy vezéreljed a LED-eket.
És előtte kimenetre állítottad a portjaidat?
//to make all pins of port A as output pins :
DDRA = 0b11111111;
...
// A porton levő LED kapcsolása
PORTA = s;
ATMEL AVR Tutorial 2 : How to access Input / Output Ports ? A hozzászólás módosítva: Jan 18, 2017
„első oszlop első ledje világít (red[0]=1).”
Az nem elég, hogy a változóknak adsz értékeket!
Ezeket az értékeket még ki kellene küldeni a megfelelő portokra is!
Hogy vezéreljed a LED-eket.
És előtte kimenetre állítottad a portjaidat?
//to make all pins of port A as output pins :
DDRA = 0b11111111;
...
// A porton levő LED kapcsolása
PORTA = s;
AVR programozás
Robi98 írta:
Idézet: „Akárhogy törtem a fejem nem találtam meg a hibát. A legmegdöbbentőbb az, hogy ha csak az animáció felét(mármint csak a feltöltődés efektust) rakom a végtelen ciklusba, akkor működik az első sor is.
A multiplexezés a 8 bites Timer2 interruptjában fut, azzal nincs gond, tökéletesen működik. Valahol a végtelen ciklusban lehet a hiba.”
Itt mellékelte a videót is, ahol látszik az animáció.
Az valóban furcsa, hogy csak akkor nem jelenik meg az első sor, ha harmadik while() ciklus is benne van a kódban.
Nekem az az elképzelésem, hogy olyan helyen van a hiba a kódban amit nem osztott meg. Pl.: az adatok kiírása a mátrixra.
Robi98:
Hogy segíthessünk légyszíves oszd meg az egész kódot, megszakítással mindennel.
Segítséget kérnék, nekem van AtTiny13A amivel akku töltőt szeretnék csinálni, de nem tudom beprogramozni.A program megvan.Ha valaki nekem beprogramozna két példányt, adnék két darabot neki.
Nekem Tőletek lenne kérdésem .Tudna valaki sagíteni ? AtTiny13A -al akku töltőt szeretnék csinálni, de nem tudom beprogramozni.A program megvan.Ha valaki nekem beprogramozna két példányt, adnék két darabot neki.
Nos, először adok egy kis hardveres betekintést:
Ugye a mátrix közös katódos RGB ledekből áll és úgy vannak összekötözgetve, hogy oszloponként vannak a közös katódok, soronként pedig a megfelelő színekhez tartozó anódok.
Összesen 4 darab 74hc595 shift regiszter vezérli a ledeket: piros sorok, kék sorok, zöld sorok, és ugye az oszlopok tehát a közös katódok. A közös katódokat a shift regiszter egy tranzisztormezőn keresztül hajtja meg mert ugye itt sok áramot kell elnyelni. És ugye emiatt egy sor bekapcsolásánál nem 0-t kell elküldeni a shift regiszternek, hanem 1-et mert ugye az kapcsolja be a megfelelő tranzisztort.
A shift regisztereket SPI buszon vezérli az ATmega8. A három színért felelős shift regiszter OE lábai össze vannak kötve és a mikrovezérlő vezérli a PB0-ás lábon. Erre azért van szükség, hogy egyszerre le lehessen tiltani őket és olyankor biztosan sötét az összes led, mert nem jelenik meg rajtuk az előző adat. A reset lábak is össze vannak kötve, hogy egyszerre törölhessem a beléjük írt adatot. Ennek külön oka van, hogy így csináltam.
A multiplexezésről: Ugye a timer2 interruptjában fut, ahogyan előzőleg írtam, hogy a főprogramtól független legyen. A vezérlő órajele:8MHz >> 64-es előosztás >> 125000Hz >> ocr2=124 >> 1ms-ként van interrupt (plusz még az a kicsi idő még végigfut.) Azaz 1ms-ig van bekapcsolva 1 oszlop, aztán a következő és így tovább.
Megpróbáltam az egyes részeket jól felkommentelni.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define redport PORTD
#define greenport PORTD
#define blueport PORTB
#define negativeport PORTB
#define OEport PORTB
#define OE PB0
#define red_select PD0
#define green_select PD1
#define blue_select PB1
#define negative_select PB2
unsigned char t=0;
unsigned char red[7];
unsigned char green[7];
unsigned char blue[7];
void resetSPI(void) // a shift regisztereknek elküldött adat törlése
{
PORTD&=~(1<<PD7);
_delay_us(1);
PORTD|=(1<<PD7);
}
void konfigTIMER(void)
{
TCCR2|=(1<<WGM21);//CTC mód TIMER2
TIMSK|=(1<<OCIE2);//interrupt bekapcsolása
OCR2=124; //125-re csordul túl
TCNT2=0;
TCCR2|=(1<<CS22);//64-es előosztás, számláló indítása
}
void konfigSPI(void)
{
SPCR=(1<<MSTR)|(1<<SPE);
SPSR|=(1<<SPI2X);// 2-es előosztás
PORTD|=(1<<PD7); // összes shift regiszter engedélyezve
}
void red_send(unsigned char red) // a piros sorokat vezérlő shift regiszternek küldi az adatot...
{
redport&=~(1<<red_select);
_delay_us(1);
SPDR=red;
while(!(SPSR & (1<<SPIF)));
redport|=(1<<red_select);
}
void green_send(unsigned char green)//ugyanígy a zöldnek....
{
greenport&=~(1<<green_select);
_delay_us(1);
SPDR=green;
while(!(SPSR & (1<<SPIF)));
greenport|=(1<<green_select);
}
void blue_send(unsigned char blue)//...és a kéknek...
{
blueport&=~(1<<blue_select);
_delay_us(1);
SPDR=blue;
while(!(SPSR & (1<<SPIF)));
blueport|=(1<<blue_select);
}
void negative_send(unsigned char negative)// az oszlopokat bekapcsoló shift regiszternek
{
negativeport&=~(1<<negative_select);
_delay_us(1);
SPDR=negative;
while(!(SPSR & (1<<SPIF)));
negativeport|=(1<<negative_select);
}
//***********************************************************
/////////////////////////////////////////////////////////////
//***********************************************************
ISR(TIMER2_COMP_vect) // itt történik a multiplexezés, tehát a megjelenítés.
{
OEport|=(1<<OE);// letiltjuk az összes shift regiszter kimenetét.
resetSPI();//töröljük a shift regiszterekben lévő előző adatot
negative_send(128>>t);//bekapcsoljuk az egyik oszlopot (elsőként a 0b10000000 mert forrasztás szempontjából így volt a legegyszerűbb megoldani)
red_send(red[t]);// PIROS adat elküldése
green_send(green[t]); //zöld adat elküldése
blue_send(blue[t]); //kék adat elküldése
OEport&=~(1<<OE);//kimenetek engedélyezése
t++;
if(t==7) t=0;// mivel hét oszlop van, 0-tól 7-ig megy
}
///////////////////////////////////////////
int main (void)
{
OEport|=(1<<OE);//letiltjuk a kimeneteket (az interruptban úgy is engedélyeződni fognak)
DDRD=0xFF;
DDRB=(1<<blue_select)|(1<<negative_select)|(1<<PB3)|(1<<PB5)|(1<<OE);
// MOSI SCK kék és negatív választó kimenet
konfigSPI();
konfigTIMER();
sei();
while(1)
{
unsigned char s=1;
while(s) //feltöltődés animáció
{
red[0]=s;
if(s>=7)
{
if(s==7) green[1]=(1);
if(s>7)
{
if(green[1]<255) green[1]=(2*green[1]+1);
if(green[1]==7) blue[2]=1;
if(green[1]>7)
{
if(blue[2]<255) blue[2]=(2*blue[2]+1);
if(blue[2]==7) red[3]=1;
if(blue[2]>7)
{
if(red[3]<255) red[3]=(2*red[3]+1);
if(red[3]==7) green[4]=1;
if(red[3]>7)
{
if(green[4]<255) green[4]=(2*green[4]+1);
if(green[4]==7) blue[5]=1;
if(green[4]>7)
{
if(blue[5]<255) blue[5]=(2*blue[5]+1);
if(blue[5]==7) red[6]=1;
if(blue[5]>7)
{
red[6]=(2*red[6]+1);
}
}
}
}
}
}
}
_delay_ms(100);
if(s<255) s=(2*s+1);
if(red[6]==255)
{
_delay_ms(100);
break;
}
}
//*************************************************************************************
//*************************************************************************************
//*************************************************************************************
s=127;
while(1) // csökkenő animáció
{
red[0]=s;
if(s<=63)
{
if(s==63) green[1]=127;
if(s<63)
{
green[1]=((green[1]-1)/2);
if(green[1]==63) blue[2]=127;
if(green[1]<63)
{
blue[2]=((blue[2]-1)/2);
if(blue[2]==63) red[3]=127;
if(blue[2]<63)
{
red[3]=((red[3]-1)/2);
if(red[3]==63) green[4]=127;
if(red[3]<63)
{
green[4]=((green[4]-1)/2);
if(green[4]==63) blue[5]=127;
if(green[4]<63)
{
blue[5]=((blue[5]-1)/2);
if(blue[5]==63) red[6]=127;
if(blue[5]<63)
{
red[6]=((red[6]-1)/2);
}
}
}
}
}
}
}
_delay_ms(100);
if(s>0) s=((s-1)/2);
if(red[6]==0)
{
_delay_ms(100);
break;
}
}
}
}
A hozzászólás módosítva: Jan 20, 2017
Már próbáltam felhivni a figyelmedet rá!
while(1)
{
unsigned char s=1; s miért itt lessz = 1 ????
while(s) //feltöltődés animáció
{
red[0]=s;
if(s>=7) s=1!!! , s < 7 ???? ezért ---
{
... erre a részre nem kerül a vezérlés
}
Kipróbáltam a main while() ciklusát, ami nálam jól megy... szimulációban.
int main(void)
// Inicializálások....
while(1)
{
unsigned char s=1;
while(s)
{
red[0]=s;
if(s>=7)
{
....
}
_delay_ms(100);
if(s<255) s=(2*s+1); // itt növeli "s" változót
if(red[6]==255)
{
_delay_ms(100);
break;
}
}
...
Robi98 szerintem azért adja meg az "s" értékét a while(1) ciklusban, mivel a harmadik while() vége után s = 0 lesz. Igy amikor main while() ciklusa másodjára futna le, akkor nem lépne be a while(s) ciklusba.
Megoldási javaslatom:
while(s) helyett while(red[6]<255)
Igy kikerülhet az "s" az első while()-ból.
az én megközelitésem
Esetleg
helyett,
volatile unsigned char t=0;
Lásd, a lap tetején lévő sárga négyszög 1. pontját. A hozzászólás módosítva: Jan 20, 2017
Felesleges volatile-nak deklaralni, mert csak a megszakitas hasznalja azt a valtozot. Igazsag szerint a megszakitas fuggvenyben kellene deklaralni igy: ISR(TIMER2_COMP_vect) // itt történik a multiplexezés, tehát a megjelenítés.
{
static unsigned char t;
...
++t;
t &= 7;
}
A hozzászólás módosítva: Jan 20, 2017
Szia!
Kérdésem lenne?
A legtöbb AVR-es projektben, csak a HEX file van megadva, viszont az (STK500) programozóban vannak Fuses és Lock bitek. Ha ezek nincsenek megadva honnan tudom meg, hogy mit kell odaírnom? Előre is köszönöm a segítséget, a választ.
|
|