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 ... 19, 20, 21 ... 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
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sob Jun 25, 2011 6:54 pm    Naslov sporočila:   Odgovori s citatom

Začel s preprostejšim primerom, vendar zadeva še kar ne deluje. uC gre v spanje, vendar pa se ne zbudi vedno/se čudno obnaša. Ko tipko pritisnem, včasih LED gori, tako kot bi morala, včasih pa samo žmigne, ko tipko spustim. Kaj pozabljam?

Koda:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define Trigger PORTB2
#define Start PORTB1

int main(void)
{
DDRB = 0b00000011;
PORTB |= 0b00001100;

PCMSK |= (1<<PCINT2);
GIMSK |= (1<<PCIE);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei();

while(1)
   {
   sei();
   sleep_mode();
   cli();

   while((PINB & (1<<Trigger))==0x00) //ko je pritisnjena tipka, LED gori
      {
      PORTB |= (1<<Start);
      }
   PORTB &= ~(1<<Start);
   }
return 0;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sre Jul 20, 2011 1:07 pm    Naslov sporočila:   Odgovori s citatom

Še vedno nisem rešil problema ... Čudno je to, da povsem enak program skompajlan iz Bascoma deluje brez problema, medtem ko program iz AVRstudio4 ne deluje. Mikrokontroler se zbudi samo včasih.

AVRStudio:
Koda:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define Trigger PORTB2
#define Start PORTB1

int main(void)
{
DDRB = 0b00000010;
PORTB = 0b00000100;

PCMSK |= (1<<PCINT2);
GIMSK |= (1<<PCIE);
MCUCR |= (1<<SM1);
MCUCR &= ~(1<<SM0);
sei();
while(1)
   {
   sleep_enable();
  sleep_cpu();
  sleep_disable();

   if((PINB & (1<<Trigger))==0) PORTB ^= (1<<Start);
   while((PINB & (1<<Trigger))==0){}
   }
return 0;
}


Bascom:
Koda:
$regfile = "attiny13.dat"
$crystal = 4800000

Config Portb.1 = Output
Config Portb.2 = Input

Enable Interrupts
Set Pcmsk.pcint2
Set Gimsk.pcie
Set Mcucr.sm1
Reset Mcucr.sm0

Trigger Alias Pinb.2
Startmotor Alias Portb.1
Portb.2 = 1

Do
Set Mcucr.se
Sleep
Reset Mcucr.se

If Trigger = 0 Then
   Toggle Startmotor
End If

Bitwait Trigger , Set

Loop

End
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.17
Kraj: Črnuče

PrispevekObjavljeno: Sre Jul 20, 2011 2:17 pm    Naslov sporočila:   Odgovori s citatom

Smiselno bi bilo preverit asm kodo, ki jo zgenerirata oba programa. Nekje je razlika.
_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
BorisP
Član
Član



Pridružen-a: Čet 03 Feb 2005 20:52
Prispevkov: 85
Aktiv.: 0.38
Kraj: Celje

PrispevekObjavljeno: Sre Jul 20, 2011 3:38 pm    Naslov sporočila:   Odgovori s citatom

Poizkusi takole definirati tipke in postavljati ledice

Koda:

//T1 = active high - se proži proti 1
//T2 = active low  - se proži proti 0
#define T1  (PINB & 0x01)
#define T2 !(PINB & 0x02)

#define ClrLED1 (PORTB &= ~(1 << PB0))
#define SetLED1 (PORTB |= (1 << PB0))
....

if (T1) SetLED1;
if (T2) ClrLED1;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sre Jul 20, 2011 4:35 pm    Naslov sporočila:   Odgovori s citatom

Take stvari sem že poskusil, dejstvo je, da program brez sleep rutine deluje kot je treba.

V priponki obe asm kodi, če bo še kdo kaj našel. Rutina okrog sleep ukaza je enaka, več pa nisem gledal.



whaa.txt
 Opis:

Download
 Ime datoteke:  whaa.txt
 Velikost datoteke:  3.54 KB
 Downloadano:  2 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jul 22, 2011 5:21 pm    Naslov sporočila:   Odgovori s citatom

Tako na hitro ima program vsaj dve napaki. Omogočiš prekinitve in:
-Nimaš spisane prekinitvene rutine.
-Nisi inicializiral stack pointerja.

Nekateri AVR-ji so po Sleep instrukciji potrebovali dva NOP-a.
Če pišeš in takoj nato bereš iz porta je dobro dati en NOP med instrukciji.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sre Jul 27, 2011 12:10 pm    Naslov sporočila:   Odgovori s citatom

Sem rešil, hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
trobida
Član
Član



Pridružen-a: Ned 09 Jul 2006 12:13
Prispevkov: 1250
Aktiv.: 5.79
Kraj: Savinjska dolina-okolica Gornjega Grada

PrispevekObjavljeno: Pet Sep 09, 2011 2:47 pm    Naslov sporočila:   Odgovori s citatom

Ponovno eno vprašanje za vse boljše poznavalce C-ja. Nekako opuščam Bascom in presedam na program C (uporabljam AVR studio in WinAvr, ter Atmega8). Osnove so mi dokaj poznane. Nekaj postov nazaj je uporabnik Lojzek spraševal kako v določeni knjižnici za LCD lahko nastaviš pine, na katerih je priklopljen LCD. Mimogrede, uporabljem isto knjižnico kot Lojzek, ki se nahaja tukaj. Knjižnico sem že preuredil mojim zahtevam. Zanima pa me sledeče; ko sem v bascomu nastavljal pine LCD-ja sem pin R/W dal na nulo (fizično maso). Tako je zadeva delovala normalno. V tem C-jevskem primeru pa vidim, da je pin R/W priključen na določen pin procesorja. Prav tako je vključen v knjižnico. Spodaj pripenjam kodo:

Koda:

#define LCD_RS   0    //define MCU pin connected to LCD RS
#define LCD_RW   1    //define MCU pin connected to LCD R/W
#define LCD_E   2   //define MCU pin connected to LCD E
#define LCD_D4   4   //define MCU pin connected to LCD D3
#define LCD_D5   5   //define MCU pin connected to LCD D4
#define LCD_D6   6   //define MCU pin connected to LCD D5
#define LCD_D7   7   //define MCU pin connected to LCD D6
#define LDP PORTD   //define MCU port connected to LCD data pins
#define LCP PORTD   //define MCU port connected to LCD control pins
#define LDDR DDRD   //define MCU direction register for port connected to LCD data pins
#define LCDR DDRD   //define MCU direction register for port connected to LCD control pins


Zanima me, ali je ta pin (R/W) obvezno potrebno priključiti na procesor ali je lahko na masi, kot v primeru v bascomu ?

Hvala za vsako pomoč in nasvet Wink .

_________________
Lp

Tomaž, S57KO
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Pet Sep 09, 2011 6:01 pm    Naslov sporočila:   Odgovori s citatom

Odvisno, kako je knjižnica spisana.
Če iz LCD-ja nikoli nič ne bere (namesto preverjanja statusa uporablja zakasnitve), je RW lahko na maso.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
trobida
Član
Član



Pridružen-a: Ned 09 Jul 2006 12:13
Prispevkov: 1250
Aktiv.: 5.79
Kraj: Savinjska dolina-okolica Gornjega Grada

PrispevekObjavljeno: Sob Sep 10, 2011 8:43 pm    Naslov sporočila:   Odgovori s citatom

@Int47, hvala za odgovor. Omenjeni pin sem v knjižnici pustil na miru, le na nek še prosti pin sem ga naslovil. Fizično pa sem ga dal na maso. Zadeva zaenkrat deluje po pričakovanjih.
_________________
Lp

Tomaž, S57KO
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



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

PrispevekObjavljeno: Pon Sep 12, 2011 6:09 am    Naslov sporočila:   Odgovori s citatom

Kolikor imam v spominu, v "moji" knjižnici ni RW pin sploh nikoli uporabljen, razen da je na začetku definiran.
Jaz sem knjižnico predelal v tej meri, da ima krmilne in podatkovne pine na različnih portih, ter da res uporablja in definira samo tiste pine porta, ki jih uporablja. V osnovi je namreč "porabila" kar celoten port in s tem po svoje preuredila I/O funkcije porta.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



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

PrispevekObjavljeno: Tor Sep 13, 2011 12:59 pm    Naslov sporočila:   Odgovori s citatom

Sedajle pa zopet jaz z vprašanjem..

Do sedaj še nisem uporabljal printf() funkcije. Ker je potrebna stdio.h knjižnica že sama zasedla preveč prostora za male mikrote (ki imajo do 2kB spomina).

Sedaj pa bom uporabil Mego8 in spomin ni tak problem.

Zanima me pa, če je moje razmišljanje pravilno in sem stvari razložene na netu pravilno razumel:

1. Printf() izpiše tisto, kar imaš podano v njenih argumentih na RS232 izhod? (pri računalniku to zapiše neposredno na ekran)

2. sprintf() pa tisto, kar imaš podano v njenih argumentih, zapiše v spomin mikrota v obliki nekega char arraya (stringa), ti pa potem moraš ta rezultat iz spomina (char arraya) spraviti tja kamor želiš, npr. na LCD ekranček?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Tor Sep 13, 2011 1:29 pm    Naslov sporočila:   Odgovori s citatom

1. printf() pošilja na stdout. Če misliš pošiljat na UART ali LCD, boš moral stdout preusmerit na neko funkcijo, ki pošlje znak kam pač mora. Tule vse lepo piše...
2. da, ampak pazi, da bo array dovolj dolg za rezultat.

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
lojzek
Član
Član



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

PrispevekObjavljeno: Čet Sep 15, 2011 1:04 pm    Naslov sporočila:   Odgovori s citatom

Zopet jaz Angel

Imam ta manjši testni programček- pisan v DEV C++. To pa zato, ker je na kompu funkcije lažje testirat kot v mikrotu.
Koda:
#include <stdio.h>
#include <string.h>

char tekst [16];
volatile unsigned int stevilo1, stevilo2;
unsigned char a,b,c;


int main ()

{
printf ("Merjenje velicin\n\n");
stevilo1 = 3510;     //napetost
stevilo2 = 220;      //tok

printf ("stevilo1=%d   stevilo2=%d\n", stevilo1, stevilo2); //TU JE VSE OK

sprintf (tekst, "U=%.2d.%.2dV I=%.1d.%.2dA\n",
         stevilo1/100, stevilo1%100, stevilo2/100, stevilo2%100);
                              //pretvorba stevilke v string:
                                //tekst = rezultat;
                                //"%.2d" = desetiška številka, z dvema ciframa
                                //stevilo1 = stevilo, ki ga želiš pretvoriti

//TU PA SE stevilo1 ŽE SPREMENI

printf ("mesto: 1234567890123456\n");
printf ("IZPIS: %s\n" ,&tekst[0]);

printf ("stevilo1=%d   stevilo2=%d\n", stevilo1, stevilo2);

scanf("%s", &a);    //počakaj pritisk neke tipke


}


Programček dve int cifri predela v string in izpiše. Lepo in pravilno. Problem pa je, da ne zastopim, zakaj mi sprintf() spremeni vrednost spremenljivke stevilo1. Dobi vrednost 10. Če pa stevilo1 na začetku nastavim na drugo vrednost, pa ima po sprintf() vrednost 2625. Opisano se vidi tudi na izseku ekrana... S poizkušanjem sem definitivno ugotovil težavo v sprintf() funkciji - premikal sem izpis cifer na razna mesta v programu. In zakaj spremeni samo stevilo1, medtem ko stevilo2 ostane kot na začetku?

Torej, kje sem ga kiksnil v tisti sprintf() vrstici Think ?



Izsek.png
 Opis:
 Velikost datoteke:  2.12 KB
 Pogledana:  7172 krat

Izsek.png


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Čet Sep 15, 2011 1:27 pm    Naslov sporočila:   Odgovori s citatom

Za zacetek povecaj array tekst za en vnos (char tekst[17]), in potem ponovno poskusi.

Kaj bi lahko bilo drugega pa na prvi pogled ni ocitno.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
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 ... 19, 20, 21 ... 27, 28, 29  Naslednja
Stran 20 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