|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3353 Aktiv.: 16.97
|
Objavljeno: Pet Sep 10, 2010 11:36 am Naslov sporočila: |
|
|
Kot en vhod uporabiš recimo 16 bitni števec. Ta ti deluje skoraj neodvisno od programa.
Kot drugi vhod uporabiš npr prekinitveno rutino, ki ti jo proži prispeli pulz na enem od external interrupt pinov in v njej recimo povečuješ eno "int" spremenljivko. Rutina naj bo kratka, da ne vpliva preveč na program.
EDIT: na tak način je sposoben delati že kak Tiny (za nekje 2-3€), recimo 2313, ki ima kasneje še dovolj pinov za izpis na LCD ali kaj drugega. |
|
Nazaj na vrh |
|
|
sortaj Član
Pridružen-a: Sre 23 Jul 2008 21:51 Prispevkov: 812 Aktiv.: 4.24 Kraj: Med Vipavo in Štanjelom
|
Objavljeno: Pet Sep 10, 2010 11:59 am Naslov sporočila: |
|
|
Hvala!
Se ne bi domislil!
Frekvenca bo verjetno pod 1kHz.
Namen sem imel uporabiti malo večji uC, ker bom gor verjetno dal še LCD, pa senzorje, potenciometre, itd.
Imel sem željo uporabit AtMega32U4, ki ima že USB bootloader, pa zaradi Atmelovih težav trenutno ni mogoča dobava
lp, Jernej _________________ Svet je bil analogen, dokler ni Planck vsega zafrknil... |
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1712 Aktiv.: 7.69 Kraj: Ig
|
Objavljeno: Pon Sep 13, 2010 9:41 pm Naslov sporočila: |
|
|
Huh...nabil sem na trdno dno
WinAvr ter prenos podatka tipa float ali double preko RS232 s pomočjo funkcije printf().
Koda: |
float Beri_tlak(void)
{
float ADC_vrednost;
float Vout;
float tlak;
ADC_vrednost = ADC_Read();
Vout = (5*ADC_vrednost) / 1024;
tlak = ((0.76+Vout) / 0.05295);
tlak = (tlak*10)+31;
printf("Tlak v glavni zanki je %f",tlak);
return (tlak);
}
|
To je samo del kode (funkcija), ki naj bi pretvorila vrednost ADCja, ki bi lahko bil tipa int v float vrednost. Compiler mi javi: ../SSI_Encoder.c:188: warning: format '%f' expects type 'double', but argument 2 has type 'float'
poizkusil sem tudi s spremenljivkami double.
napravil sem tudi tole
vendar vse kar dobim kot vrednost je "?".
Imel že kdo podobno težavo?
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1712 Aktiv.: 7.69 Kraj: Ig
|
Objavljeno: Pon Sep 13, 2010 10:24 pm Naslov sporočila: |
|
|
Si bom sam odgovoril.
V linker je potrebno vpisati tole: -Wl,-u,vfprintf -lprintf_flt -lm
Sedaj dela.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
|
logist Član
Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.73 Kraj: dom(o)vina
|
Objavljeno: Pon Sep 27, 2010 10:03 pm Naslov sporočila: |
|
|
Mene pa zanima, če je taka uporaba Watchdog-a smiselna, ker delam prvič z njim in me zanima, a sem prav razumel, kaj sem prebral.
Koda: |
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
//Vpis logične vrednosti 1 v WDTOE in WDE
WDTCR = (1<<WDTOE) | (1<<WDE);
//Izklop WDTRC
WDTCR = 0x00;
}
void main(){
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
//WDTCR=0x0F;
#asm("wdr");
while(1){
WDTCR = (0<<WDTOE) | (0<<WDE);
WDTCR=0x0F;
}
} |
|
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.09 Kraj: Ptuj-Maribor
|
Objavljeno: Pon Dec 27, 2010 8:02 pm Naslov sporočila: |
|
|
Danes sem priden in delam z mega16. Timerje sem osvojil (sedaj upam tako trditi)
Pa vseeno me muči ena koda.
Koda: |
#include <avr/io.h>
int main (void)
{
unsigned char i=0;
DDRB |= ((1 << 0)|(1 << 7)); // Set LED as output
// TCCR1B |= (1 << CS10); // Set up timer at Fcpu
TCCR1B |= (1 << CS11); // Set up timer at Fcpu/8
// TCCR1B |= ((1 << CS10) | (1 << CS11)); // Set up timer at Fcpu/64
// TCCR1B |= (1 << CS12); // Set up timer at Fcpu/256
// TCCR1B |= ((1 << CS10) | (1 << CS12)); // Set up timer at Fcpu/1024
for (;;)
{
// Check timer value in if statement, true when count matches 1 second
if (TCNT1 >= 500)
{
PORTB ^= (1 << 0); // Toggle the LED
TCNT1 = 0; // Reset timer value
i++;
if(i>=1000)
{
PORTB ^= (1 << 7); // Toggle the LED
i=0;
}
}
}
} |
S Timerjem delam 0.001ms delay in si "izpisujem" na LED na PORTu B.
Problem:
Pri AVRStudio simulaciji deluje, v realnosti na plošči ne. Zakaj?
Če delam 10ms delay mi deluje ok, tudi pri 1s. (spreminjam TCNT1 in delilnik). |
|
Nazaj na vrh |
|
|
logist Član
Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.73 Kraj: dom(o)vina
|
Objavljeno: Pon Dec 27, 2010 8:16 pm Naslov sporočila: |
|
|
Uporabi prekinitev (primer napisan za Atmega32):
Koda: |
unsigned int i_timer1;
ISR(TIMER1_COMPA_vect){
i_timer1++;
if(!i_timer1%4){ // vsako sekundo (približno) 0,256 * 4 = 1,024 s
// koda ki se izvede ob prekinitvi;
}
}
int main(void){
//Nastavitev registrov casovnika 1 (Timer/Counter0),
TCNT1 = 0x00; // postavitev registra stetja casovnika 1 na 0
//deljenje sistemske ure s 1024, ter nastavitve izbrisa registra ob ujemanju vrednosti (CTC),
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10)|(1<<WGM12);
//omogocitev prekinitve poteka stevnika (Timer Overflow),
TIMSK = (1<<OCIE1A);
//registra ujemanja vrednosti (OCR1)
OCR1A = 2000; //1A - ujemanje vrednosti vsake 0,256 s
while(1){}
return 0;
}
|
Če pa želiš imeti točno na sekundo pa ti priporočam da uporabiš DS1307 (kateremu lahko določiš datum in uro in s katero frekvenco se ti bo izvajala prekinitev). Dela pa na i2c vodilu in lahko mu vežeš baterijo, da ob izpadu elektrike ti ura in datum tečeta še naprej. _________________ Mihael |
|
Nazaj na vrh |
|
|
piroman Član
Pridružen-a: Čet 23 Okt 2003 12:06 Prispevkov: 2707 Aktiv.: 12.15 Kraj: Ljubljana
|
Objavljeno: Pon Dec 27, 2010 8:29 pm Naslov sporočila: |
|
|
Če je frekvenca oscilatorja 8 MHz (tega ne vemo) in imaš vklopljen delilnik 1/8 (to pa vemo), se ti timer premakne za eno vrednost vsako us; ravno toliko, kot hočeš delaya... _________________ One shouldn’t work on semiconductors, that is a filthy mess; who knows if they really exist!
Wolfgang Pauli, 1931 |
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.09 Kraj: Ptuj-Maribor
|
Objavljeno: Pon Dec 27, 2010 8:47 pm Naslov sporočila: |
|
|
Frekvenca je 4MHz, delim z 8. Tako bi moral imeti 500 taktov, da bi bila zakasnitev 1ms.
Ampak mi je ne izpisuje na PORTB.7 |
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.09 Kraj: Ptuj-Maribor
|
Objavljeno: Pon Dec 27, 2010 9:08 pm Naslov sporočila: |
|
|
sem se že ujel. Problem je bil pri:
potem pa:
premajhna spremenljivka. |
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.09 Kraj: Ptuj-Maribor
|
Objavljeno: Čet Dec 30, 2010 8:42 pm Naslov sporočila: |
|
|
@lojzek
Vprašanje zate.
Torej, rad bi izpisal vrednost neke spremenljivke na LCD.
LCD mi deluje normalno, pišem lahko s funkcijo LCDstring("nekaj", 5),...
Mi pa ne deluje LCDsendChar();
v tvojem primeru vidim, da delaš na tak način:
Koda: |
volatile unsigned char i = 18;
LCDGotoXY(0,0);
LCDsendChar(i+48);
|
meni pa žal to ne deluje. Izpiše mi nek B...? |
|
Nazaj na vrh |
|
|
RUros Član
Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1030 Aktiv.: 4.67
|
Objavljeno: Čet Dec 30, 2010 11:40 pm Naslov sporočila: |
|
|
B ti izpiše zato, ker če vpišeš cifro v oklepajih, bo izpisal po ascii kodi znak ki je na številki i+48=66, ki pa je ravno B (veliki b). Lahko pogledaš ascii pa boš videl, da je desetiško po ascii kodi B ravno 66.
kaj želiš izpisati ? |
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.09 Kraj: Ptuj-Maribor
|
Objavljeno: Pet Dec 31, 2010 12:34 pm Naslov sporočila: |
|
|
Aham, se mi je zdelo, da je nekaj v tem primeru. Ampak lojzeku pa izpisuje v redu.
sedaj sem rešil z drugim prijemom.
Koda: |
sprintf(msg, "i=%d", i);
LCDstring(msg, 5); |
tako pa mi pravilno izpisuje spremenljivke.
Hvala vseeno. |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.07 Kraj: KOPER
|
Objavljeno: Pet Dec 31, 2010 1:45 pm Naslov sporočila: |
|
|
Zabavam se z FLIPom on pa z mano. Ko naložim program v AT90USB1287 ta deluje v redu. Ko prekinem napajanja ali resetiram pa pazabi na program. Kje ga lomim ?.
Hvala. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
logist Član
Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.73 Kraj: dom(o)vina
|
Objavljeno: Pet Dec 31, 2010 1:55 pm Naslov sporočila: |
|
|
žrepko je napisal/a: |
Aham, se mi je zdelo, da je nekaj v tem primeru. Ampak lojzeku pa izpisuje v redu.
sedaj sem rešil z drugim prijemom.
Koda: |
sprintf(msg, "i=%d", i);
LCDstring(msg, 5); |
tako pa mi pravilno izpisuje spremenljivke.
Hvala vseeno. |
Lahko pa uporabiš tole kodo : http://extremeelectronics.co.in/avr-tutorials/using-lcd-module-with-avrs/ čist na koncu pod številko 148 pa uporabi še kodo, če imaš 4x(XY) LCD. Avtor popravka pa sem jaz.
Lp,
Mihael _________________ Mihael |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 68 dni
Powered by phpBB © 2001, 2005 phpBB Group
|