Jump to content
GIGN Forum

C++ Koda Debugs (atmega16 Mikrenei)


ANALGINS
 Share

Recommended Posts

taisu robotu, detalas neizpludisu, bet nestrada pin'u definesana, pie pin'iem ir pievienoti 2i led'i kurus gribu saprogramet lai dazados intervalos tie flashotu, tiiri sakumam lai varetu izprast ko leilaku, kas naks pec nepilna gada :)

sheit bus source cerams kads pateiks kur ir kluda, avr studio 4 (pashreiz izmantoju) neuzrada bugus, jo itka ir vis pareizi, bet man flashojas tikai viens led's >.<

/*********************************************
* Author: Karlis Kalns, Copyright: GPL 
* This program is to test the led connected to
* PD4. 
* Chip type           : ATmega16
* Clock frequency     : 16,000000 MHz
*********************************************/
#include <avr/io.h>
#include <mega16.h>
#include <util/delay.h>
#define sbi(a, B)  (a |= (1<< B))
#define cbi(a, B)  (a &= ~(1 << B))
#define set_bits(a, B)  (a |= (1 << B))
#define clear_bits(a, B)  (a &= ~(1 << B))

void delay_ms(unsigned int time_ms)
{
  while (time_ms--)
    _delay_ms(1);
}

int main(void)
{
    /* enable  PD4 as output */
    sbi(DDRD,PD4);
    while (1) {
        /* led on, pin=0 */
        cbi(PORTD,PD4);
        delay_ms(50);
        /* set output to 5V, LED off */
        sbi(PORTD,PD4);
        delay_ms(50);}
        //test flash 2 led on port D5
        sbi(PORTD,PD5);
        while (1) {
        delay_ms(100);
        cbi(PORTD,PD5);
        delay_ms(100);
        sbi(PORTD,PD5);
        delay_ms(100);

}
}

paldies par uzmanibu

Edited by ANAL-GINS
Link to comment
Share on other sites

iznjem no while cikla to pd5 wlashosanu. Tu galigi slikti programe vecit!

tev ir uzrakstits

kamer(muzhiba) ieslegt un izslegt pd4 un kamer muzhiba ieslegt un izslegt pd5, bet problema ir tada, ka kamer muzhiba uz pd5 nekad neatgriezhas pd4 cikla!

?Nezinu, vai tu rubi to, ko es saku, bet

while(1)

{ .... bulshit...}

nekad nebeidzas un tas nozime, ka otrais while visu laiku dzivojas sevi! Vienkarshi izmet otru while ciklu un tev viss aizies!

gribi piedalities sumo sacensibas 13 septembri? :D

BEefs

edit:

kartoche lai tu nesapistos smadzenes

int main(void)

{

/* enable PD4 as output */

sbi(DDRD,PD4);

while (1) {

/* led on, pin=0 */

cbi(PORTD,PD4);

delay_ms(50);

/* set output to 5V, LED off */

sbi(PORTD,PD4);

delay_ms(50);}

//test flash 2 led on port D5

sbi(PORTD,PD5);

// nahuhj while (1) {

delay_ms(100);

cbi(PORTD,PD5);

delay_ms(100);

sbi(PORTD,PD5);

delay_ms(100);

// arii nahuj}

}

AFIGENA SVARIGI!!!! EDIT EDIT!@

tur kur sakuma ir sbi(DDR, PD4)l tur vajag ari rindinju SBI(DDR, PD5); Tas ir vajadzigs, lai tu pateiktu mikrokontrolierim, ka PD5 ir output pins.

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

ahahaa skaidriite :)

es jau gribetu, bet nuuu man ar to visu ta palenam iet uz prieksu, ir shasija prieks linij sekotaja, bet lai uzceptu summo vaidzes vienkarsi uzmetinat pec kriterijiem atbilstosu rami, lai citi pastumt nevaretu :D

programesana man tik tiesam ir sudiga, tik tiko te uzgaju linku uz c++ basic'iem, ar septembri skola man baros ar pascal, kas ar nedaudz noderes :)

spec foruma man to fignju nevareja pateikt >.<

svariigaa ediite worm'am: redz ir iemesls atstat sho sadalju, jo cilveki nodarbojas ar dazhadam lietam, un var izpalidzet citiem, sha testesu mikreni, turat ikshkjus :)

ediite2: vainu blad esmu nepietas naglas pielodejis ledu ( kas nav nemaz iespejams no ta ir priekspedejais pins viena sana..), vai ari softa ir kads bugs, jo man neflashojas otrais leds

edite3: spec foruma teicas ka man autputi nav pareizi defineti, aka shi vieta

#define sbi(a, b)  (a |= (1<< b))
#define cbi(a, b)  (a &= ~(1 << b))
#define set_bits(a, b)  (a |= (1 << b))
#define clear_bits(a, b)  (a &= ~(1 << b))

atbild tikai par PD4, ta tas varetu but ? manliekas ka tas butu koda garuma vien del neefektivs risinajums, jo mikrenem taks nav neierobezhota atminja :( laigan esmu uzgajis ka MMC un SD kartes pievienot klat :D

Edited by ANAL-GINS
Link to comment
Share on other sites

Tev vajag šitādu kodu -

int main(void)
{
     sbi(DDRD,PD4); //PD4 output
     sbi(DDRD,PD5); //PD5 output
     while (1) {
          cbi(PORTD,PD4); //nezinu shemu, bet te ldu manu prat izsledz
          cbi(PORTD,PD5); // te otru
          delay_ms(50);
          sbi(PORTD,PD4); // te iesledz pirmo
          sbi(PORTD,PD5); // te iesledz otro
          delay_ms(50);
     }
}

Šitajam točna būtu jāstrādā! Protams, augšā atstāj tās defines!

Tas, ko es pirms tam ierakstiju, tur nav īsti pareizi saliktas {} iekavas... ;)

Beefs

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

cepums tev Beef :)

jautajums tads,

sbi(DDRD,PD4); //PD4 output

sbi(DDRD,PD5); //PD5 output

te ieruba abus, pinus aka ledus, starp tiem drikst likt delay, lai ieslegtos dazaados laikos ?

protams es to varetu elementari izdarit, bet liekas ka ir ari tada lieta ka neefektivitate, un ka to apiet savadak ( diez jau vai :D )..

otrs butu ka angliski sauc cilku ? ir ideja uztaisit parastu cilku kuraa mirgo leds, kad tiek iziets cikls iedegas otrs leds, un atkal no sakuma ..

paldies par uzmanibu, un otrs cepums Beef'am :)

Link to comment
Share on other sites

Taisot while(1) ciklu, tev enīvei kaut kāds delajs jāuzliek ir, citādi cpu nograuzīsi 100%... vislabāk būtu kaut kādu timestamp ieviest katram ledam. Tad tu vari delay uzlikt uz 0.5 sekundēm un visu laiku pārbaudīt vai timestamp ir lielāks par expire laiku. Piemēram vienam ledam uzliksi expire laiku 1 sekunde, otram 5 sekundes. Viens smuki mirgos, otrs tikmēr degs :)

Link to comment
Share on other sites

Rekur kaut kāds pseidoshits, kas to dara:

delay = 50;
blinkA = 5000;
blinkB = 200;

cycleA = 0;
cycleB =0;

while(1)
{
cycleA += delay;
cycleB += delay;

if ( cycleA >= blinkA )
{
  // pārslēdz A LEDa stāvokli
  cycleA = 0;
}

// to pašu izdari pēc tam ar B, utt.

delay_ms(delay);
}

Link to comment
Share on other sites

Nu vispār jau atmeli programē C nevis C++ (tur nav klases un objekti!).

Jā, pārāvumi ir interupti. Tobiš - tev izsaucas speciāla pārāvumu apstrādes funkcija, kurā tu apskaties, kāds pārāvums ir noticis. Atmelī var iekonfigurēt hardware taimer, kurš, piemēram, uz katrām 16 000 instrukcijām izsauc pārāvumu. Sanāks, ka pie 16 MHZ pārāvumu izsauc katru milisekundi. Tad pārāvumā var skaitīt to mainīgo un slēgt lampiņas iekšā/ārā, bet galvenajā ciklā (main() { .... while(1) { galvenais cikls }) nedarīt neko, vai ielikt procesoru pazemināta patēriņa režīmā vai darīt kaut ko citu, kam ir real time nepieciešams.

.h failos glabājas definīcijas. Piemēram, tu vari uztaisīt sviests.h un ielikt tajā failā tād cbi, sbi defines un pēc tam, kad kodēsi, tev sākumā nebūs jāraksta tās defines, bet pietiks ar #include <sviests.h>

Piedevām .h failos var arī aprakstīt funkcijas (bez koda. tikai nosaukums). un .c failos būtu tās funkcijas kods, bet programā varētu iekļaut to .h failu un tās funkcijas būs pieejamas tavā programā.

.h faili ir header faili.

iečeko www.elfa.lv forumu. Tur daudz džeki ņemas ar elektroniku. Arī ar atmel.

Beefs

*.c ir c++ faili bet kas ir *.h ? biblotekas vai kas cits ?

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...