www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 15, 16, 17 ... 27, 28, 29  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Sep 10, 2010 11:36 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
sortaj
Član
Član



Pridružen-a: Sre 23 Jul 2008 21:51
Prispevkov: 812
Aktiv.: 4.25
Kraj: Med Vipavo in Štanjelom

PrispevekObjavljeno: Pet Sep 10, 2010 11:59 am    Naslov sporočila:   Odgovori s citatom

Hvala!
Se ne bi domislil! Mr. Green

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 Sad


lp, Jernej

_________________
Svet je bil analogen, dokler ni Planck vsega zafrknil...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pon Sep 13, 2010 9:41 pm    Naslov sporočila:   Odgovori s citatom

Huh...nabil sem na trdno dno Smile

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pon Sep 13, 2010 10:24 pm    Naslov sporočila:   Odgovori s citatom

Si bom sam odgovoril.

V linker je potrebno vpisati tole: -Wl,-u,vfprintf -lprintf_flt -lm

Sedaj dela.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.73
Kraj: dom(o)vina

PrispevekObjavljeno: Pon Sep 27, 2010 10:03 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pon Dec 27, 2010 8:02 pm    Naslov sporočila:   Odgovori s citatom

Danes sem priden in delam z mega16. Timerje sem osvojil (sedaj upam tako trditi) Smile
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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.73
Kraj: dom(o)vina

PrispevekObjavljeno: Pon Dec 27, 2010 8:16 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
piroman
Član
Član



Pridružen-a: Čet 23 Okt 2003 12:06
Prispevkov: 2707
Aktiv.: 12.19
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 27, 2010 8:29 pm    Naslov sporočila:   Odgovori s citatom

Č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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pon Dec 27, 2010 8:47 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pon Dec 27, 2010 9:08 pm    Naslov sporočila:   Odgovori s citatom

sem se že ujel. Problem je bil pri:
Koda:
   unsigned char i=0;

potem pa:
Koda:
if(i>=1000)

premajhna spremenljivka.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Čet Dec 30, 2010 8:42 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RUros
Član
Član



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1030
Aktiv.: 4.69

PrispevekObjavljeno: Čet Dec 30, 2010 11:40 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pet Dec 31, 2010 12:34 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 6.09
Kraj: KOPER

PrispevekObjavljeno: Pet Dec 31, 2010 1:45 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.73
Kraj: dom(o)vina

PrispevekObjavljeno: Pet Dec 31, 2010 1:55 pm    Naslov sporočila:   Odgovori s citatom

ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 15, 16, 17 ... 27, 28, 29  Naslednja
Stran 16 od 29

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group