|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sob Jun 25, 2011 6:54 pm Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sre Jul 20, 2011 1:07 pm Naslov sporočila: |
|
|
Š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 |
|
|
Highlag Član
Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 18.10 Kraj: Črnuče
|
Objavljeno: Sre Jul 20, 2011 2:17 pm Naslov sporočila: |
|
|
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 |
|
|
BorisP Član
Pridružen-a: Čet 03 Feb 2005 20:52 Prispevkov: 85 Aktiv.: 0.38 Kraj: Celje
|
Objavljeno: Sre Jul 20, 2011 3:38 pm Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sre Jul 20, 2011 4:35 pm Naslov sporočila: |
|
|
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.
Opis: |
|
Download |
Ime datoteke: |
whaa.txt |
Velikost datoteke: |
3.54 KB |
Downloadano: |
2 krat |
|
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Pet Jul 22, 2011 5:21 pm Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sre Jul 27, 2011 12:10 pm Naslov sporočila: |
|
|
Sem rešil, hvala!
|
|
Nazaj na vrh |
|
|
trobida Član
Pridružen-a: Ned 09 Jul 2006 12:13 Prispevkov: 1250 Aktiv.: 5.77 Kraj: Savinjska dolina-okolica Gornjega Grada
|
Objavljeno: Pet Sep 09, 2011 2:47 pm Naslov sporočila: |
|
|
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 .
_________________ Lp
Tomaž, S57KO |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Pet Sep 09, 2011 6:01 pm Naslov sporočila: |
|
|
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 |
|
|
trobida Član
Pridružen-a: Ned 09 Jul 2006 12:13 Prispevkov: 1250 Aktiv.: 5.77 Kraj: Savinjska dolina-okolica Gornjega Grada
|
Objavljeno: Sob Sep 10, 2011 8:43 pm Naslov sporočila: |
|
|
@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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pon Sep 12, 2011 6:09 am Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Tor Sep 13, 2011 12:59 pm Naslov sporočila: |
|
|
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 |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.66
|
Objavljeno: Tor Sep 13, 2011 1:29 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Čet Sep 15, 2011 1:04 pm Naslov sporočila: |
|
|
Zopet jaz
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 ?
Opis: |
|
Velikost datoteke: |
2.12 KB |
Pogledana: |
7211 krat |
|
|
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.96 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Sep 15, 2011 1:27 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|