Programování uC Microchip v C

Zdravím všetkých, skúsim priblížiť môj problém, keďže tiež sa snažím prejsť na jazyk C, konkrétne pre PIC18, ešte presnejšie PIC18F2320
Ide o to, že si neviem dať rady s dá sa povedať napálením programu. Napísal som si program, vlastne 2 programy, ktorých funkčnosť je overená aj v Proteuse, no po napálení programu sa furt stane to isté, tesne po tom, ako program napálim, LEDka na moment blikne a potom už vôbec nesvieti.Toto mi napríklad spraví aj pri programe Hello World, kedy by blikať vôbec nemala. Nestretol sa niekto s niečim podobným, alebo neviete čo robím zle, dá sa povedať, že robim ten isty postup napalovania ako aj pri PIC16F. Prípadne je niečo zle na programoch ?
Programátor mám PICKIT2, kompiler MCC18.
Ďakujem :slight_smile:

Program svetelný had:

[code]
#include <p18f2320.h>
#include <delays.h>

void main()
{
TRISB=0b00000000; // Porty B= vystupy
LATB=1;

while (1)
{
if (LATB==0b00001000) {
LATB=1;}

Delay10KTCYx(25);
LATB=LATB<<1;

}

} [/code]

ked to v proteuse ide a na doske nie tak asi bude hardware problem nie ?

Ano, bolo to v nastavení konfiguračných bitov. Už to ide :slight_smile:

Nadar,
je to síce staršia téma, prečítal som ju niekoľkokrát. Mal som v pláne skúšať programovanie v C s 16f887. Neviem však ako pracovať s Hitech-C kompilerom v Mplabe. Nemá niekto mini návod?
Ďakujem.

Myslel som si, že verzia Lite od Hi-techu je free, ale asi nie je, zrejme mi už dávno vypršala verzia trial a preto mi to “nefachčí”. Teraz svoje začiatočnícke pokusy v C realizujem v systéme MikroC. Malou nevýhodou je, že tento program nepoznám a musím sa to naučiť. Mplab som už troška ovládal. Takže je všetko ok.

Začínám s C a 16b PIC a nevím si rady. V asm jsem byl docela zvyklej na vyhledávací tabulky co byly normálně uložený v paměti programu. Existuje toto v C? Potřeboval bych takhle zralizovat tabulku o cca 400 položkách.

         ADDWF      PCL,F
         RETLW       hodnota_1
         RETLW       hodnota_2
            .
            .
            .
         RETLW       hodnota_n

Cau,toto asi neni, nebo sem to jeste neobjevil, ale pouziva se switch, bohuzel v tvem pripade o 400 polozkach je to na dlouho(pri ty 400ty)

edit: ehmm, sem spatne pochopil otazku … :blush:

Ha, už jsem na to přišel, stačilo důkladně prolistovat literaturu od PepinaCz… “programování 16 bitocých mikrokontrolérů PIC v C” a hlavně to nepřehlédnout.

const char bitmap[22] = {
	0b00000000,
	0b00000000,
                  .
                  .
                  .
              0b00000000};

A pak k tomu přistupuji jako by to bylo pole, ale PIC to čte z FLASH a ne z RAM. To je chytrý.

PIC to čte z flashky protože to pole je deklarované jako konstanta - a ty jsou vždy ve flash

char bitmap[22]; bude v ram

Prosím, potřeboval bych nakopnout správným směrem. Jak se da pro kompilator microchip C30 udelat nekolik bitovych proměnných v registru?
V asm na pic 16/ 18 myslim toto:

PRIZNAKY EQU 0x20

#DEFINE ZMENA PRIZNAKY,0
#DEFINE PRETEKLO PRIZNAKY,1
.
.
.
 #DEFINE CHYBA PRIZNAKY,7

Mam sice v PIC24 přes 90kB volne ramky, ale přijde mi divny na uchování jednoho bitu používat char.
Vlakno jsem prošel a popisované metody na C30 nefunguji, defuckto nic funkcniho jsem nevygoohlil. Možná problém mezi židlí a klavesnicí.
Díky

Pomocí struktury (je to obecně C, nikoli jen microchip). Jen nevim, jesli donutíš překladač to dát do registru (slovo “register” před deklarací proměnný) když je to struktura. Překladač bude ovšem pro práci používat bitové operace, bude to tedy pomalejší než pole charů (ovšem kdyby to bylo v registru, mohlo by to vyjít nastejno).
Stejným způsobem jde třeba přetypovat int32 a přistupovat přes tečku k jednotlivým bytům.[code]typedef struct
{
unsigned boolProm1: 1; // “: 1” => promenna ma 1 bit
unsigned boolProm2: 1;
unsigned boolProm3: 1;
unsigned boolProm4: 1;
} bitfield_t;

int _tmain(int argc, _TCHAR* argv])
{
bitfield_t bitovePole;

bitovePole.boolProm1 = 1;

return 0;

}[/code]

zdravím, můžu se zeptat.
Mám hi tech c a 16f628a.
Když udělám jednoduchý program

PORTA= 0b00000000;
PORTB= 0b00000000;

PORTA= 0b11111111;
PORTB= 0b11111111;

tak port b funguje v pohodě, ale u portu a se mi mění jen bity 7,6,4 ostatní nereagujou :frowning:

Cau,

skus se kouknout do helpu , tam to urcite bude

[code]#DEFINE PRIZNAKY 0x20

#DEFINE ZMENA =PRIZNAKY,0
#DEFINE PRETEKLO =PRIZNAKY,1 [/code]popripade nejak podobne

milionkrat probirany a Xkrat probyrany zde na foru, otevri si datašít , najdi si PIN DIAGRAMS a koukni se na piny 0-7 portu A, ktera periferie je sdilena na pinech ktery ti nefungujou ? a ta i zrovna neni na pinech ktery ti fungujou
staci ji pak vypnout…

Sorry, už to mám Zrovna sem na to po dvou dnech přišel. RA je jen vstup a zbytek nešel pro to, že sem nevypnul komparátor.

Ještě bych se chtěl zeptat na jednu věc. Do manuálů sem koukal i hledal na netu. Ale našel sem řešení, které používám i já a nezdá se mi moc vhodné.

Potřebuji vyčítat jednotlivé čísla z int abych je mohl zobrazovat na LED displeji.
Teď používám dělení
num1 = int/10;
num2 = int%10;

sice to funguje, ale nelze nějak nednodušeji?

Jednoduchsie co tym myslis, to ze ti to zabera vela miesta v programe?

No, třeba kdybych měl číslo o 8 znacích, tak se z toho udělím. Jestli není nějaká možnost přistupovat přímo k jednotlivým znakům.

Možnost není a dokud nevytvoříš mcu pracující v desítkové soustavě, tak ani nebude. Jelikož jsou data v paměti uložena v 16kové soustavě (2 16kové cifry na 1 B), můžes jednoduše přistupovat právě pouze k hexa znakům.
To se ovšem dá vyřešit budeš-li mít číslo uloženo v BCD nebo každou číslici v jiné proměnné.

Jo jasně, chápu. Takže to dělení se běžně používá? Mě šlo o to, abych to nedělal zbytečně složitě, protože se teprve učím.
Teď právě laboruju s čidlem 18b20, tak sem hledal, jak nejlíp ukázat tu hodnotu na displeji.

Určitě ovšem máš možnost si číslo převést na string - překladač jistě zná nějakou verzi itoa().