While loop i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

While loop i C

Inlägg av Bola »

Hej, jag har försökt mig på att koda lite i C och utgått från en kod jag hittat på detta forumet som jag tänkte lära mig och förstå samt bygga på.
Jag har modifierat denna koden lite och tanken är att den ska sluta blinka efter 10 gånger. Men det gör den inte den kör igenom alla stegen oändligt många gånger. Vad kan felet i koden ligga?

Kod: Markera allt

#define _XTAL_FREQ  4000000
#include <htc.h>

int nummer;
nummer=1;
void main(void) {

   OSCCON  = 0x60; 
   ANSEL   = 0;

   TRISC1 = 0;      //Output
   while(nummer<10) {       //Loop

      PORTC = 0xff;
      __delay_ms(100);

      PORTC = 0;
      __delay_ms(100);
	nummer=nummer+1;

  }

PORTC = 0;
 __delay_ms(100);

}

Sen eftersom jag inte har gjort denna koden själv så undrar jag (har skjälvklart sökt på google och i datablad)
vad OSCCON = 0x60; och ANSEL = 0; gör?

och denna PORTC = 0xff; sätter på alla c utgångar men jag har inte riktigt förstått hur man gör för att bara sätta på en utgång? och framförallt vad 0xff står för, antar att detta är en adress i en bank?

Lite många frågor där men jag hoppas att någon kan hjälpa mig med om inte alla så iallfall någon =)


EDIT: kan tillägga om någon undrade att jag kör med en PIC16F690 och MPLAB, HI-TECH C Compiler
Användarvisningsbild
jetta90
Inlägg: 48
Blev medlem: 9 oktober 2009, 15:22:11
Ort: örebreo

Re: While loop i C

Inlägg av jetta90 »

nummer=nummer+1 gör ju att numer är 1 hela tiden !
för att öka använd nummer++ istället
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: While loop i C

Inlägg av TomasL »

Vad menar du med kör koden oändligt?.
I simulator eller i verkligheten?
OSCCON och ANSEL är register i processorn, du hittar dem i databladet.
TRISC bestämmer om porten/bitarna skall vara in (1=Input) eller utgångar (0= Output).
PORTC= sätter porten.
0xFF är notationen för hexadecimalt, 0B00000000 för binärt, decimala tal skrivs som vanligt.

Ett tips, skriv "10>nummer" i stället så slipper du många otrevliga buggar.
Tex

"if(a=1)" // är ett fel som kompilatorn inte upptäcker.
Den riktiga varianten ser ut så här "if(a==1)"
Den första ger en mycket vanlig bug, som är mycket svår att hitta (i regel), i det andra exemplet så undersöker du om a är lika med 1 (a==1)
I det första exemplet tilldelar du a värdet 1, vilket sannolikt inte var det du ville.
Men om du skriver så här i stället:

if(1==a) så blir det fortfarande rätt, med den skillnaden att om du glömmer ett av =-tecknenså det blir:
(1=a) så kommer kompilatorn att ge fel, eftersom en konstant inte kan ändras.

Sedan finns det ingen anledning i detta exemplet att definera "nummer" som en INT, "char" är bättre och i detta fallet en "unsigned char"

Jetta, nej det är samma sak, a=a+1 är samma sak som a++.
Användarvisningsbild
sebgus
Inlägg: 408
Blev medlem: 11 december 2007, 09:51:17
Ort: Göteborg

Re: While loop i C

Inlägg av sebgus »

Nu har jag lite huvudvärk o så.. så mina svar kanske inte blir sådär jätteinformativa, men försöker så gott jag kan!

Först och främst;

Har du kollat så ingen watch-dog timer är aktiverad eller så? Kolla detta genom att gå in i configuration-bits och stäng av den om den är aktiverad. Watch-dog timern gör att processorn återställs efter några mikrosekunder eller vad det nu är, och därmed ser det ut som den kör igenom loopen oändligt antal gånger eftersom den återställs hela tiden.

I OSCCON-registret anger du vilken frekvens som mikroprocessorns interna klocka ska gå i. Just 0x60 innebär att den ska köras i 4 MHz.

ANSEL-registret anger analoga pinnar. Pinnar som är satta till ingångar kommer vara 0.

PORTC = 0xFF; Innebär att du skickar ut värdet FF på c-porten, dvs. 11111111 binärt, dvs. "tända" alla c-pinnarna.
TRISC = 0xFF; Innebär däremot att du sätter alla till ingångar, TRISC = 0x00; att alla ska vara utgångar.

Så PORTx är värdet du ska skicka ut, TRISx anger du vilka pinnar som ska vara in/ut-gångar.

Använd windows inbyggda miniräknare för att omvandla mellan hex och binärt så ser du mycket enklare hur det ligger till.

Fråga mer om det är något oklart!

EDIT: TomasL var visst före :).
Ett tips är också att du kan skriva t.ex. RC0=1; om du vill tända specifika pinnar utan att hålla på med binära och hex-tal. Detta kräver dock att du inkluderar din pic-fil (#include <pic16F690.h>)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: While loop i C

Inlägg av sodjan »

Jag orkar inte läsa igenom föregående inlägg, men den viktigaste frågan
du ska ställa dig är :

-- vad händer när "while(nummer<10)" loppen tar slut ??

Tänk också på att en mikrokontroller *alltid* kör *någonting* !
Det är inte alls säkert att processorn "stannar" bara för att koden "tog slut".

Min gissning är att efter 10 varv i while-loopen så (efter 100 ms)
startar hela programmet om igen från början. Detta upplever du som
att while-loopen aldrig tar slut, men det gör den sannolikt...

Prova bara med ett lägga en tom "while 1 {}" istället för din sista wait.
Eventuellt får du lägga något (t.ex en wait) i den sista while-loopen
för att den inte ska optimeras om, men det märker du...

Sen kan det vara en massa annat som t.ex WDT, men det har inget
med while-loopen att göra, och jag utgår från att du vet hur en PIC
processor fungerar rent generellt, det var ju inte det du frågade om.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: While loop i C

Inlägg av Icecap »

En grej man kan använda till andra saker:

För att byta läge på en bit:
X ^= 0x10; // Växlar läge på bit 4 i byte X

Skal man då blinka en bit kan man alltså nöja sig med ett delay-kall (om man använder sånt...) då detta kommer att vara båda av- och på-tid. Kan självklart kombineras med olika bitmönster.
hatten
Inlägg: 94
Blev medlem: 9 maj 2008, 22:16:23
Ort: Uppsala

Re: While loop i C

Inlägg av hatten »

Din main-funktion ser felaktig ut. Vad tror du händer då du kommer till slutet av funktionen, dvs efter den sista __delay_ms(100)?

Lägg till while(1) { ; } mot slutet.

EDIT; Missade sodjans inlägg, skyller på kaffebrist..
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: While loop i C

Inlägg av Bola »

Får börja med att tacka för kanonsvar dessa har verkligen hjälpt mig!!
Ett tips är också att du kan skriva t.ex. RC0=1; om du vill tända specifika pinnar utan att hålla på med binära och hex-tal. Detta kräver dock att du inkluderar din pic-fil (#include <pic16F690.h>)
Detta låter ju mer än bekvämt, så jag tänkte att jag tar väl och laddar ner en sådan fil och tog denna: http://www.koders.com/c/fid8E3FDC8DD4CA ... 82788.aspx
Jag la den i samma mapp som hexfilen, projektfilen och .c filen ligger i och skrev #include <pic16F690.h> i .c filen. När jag kör project>build så får jag detta error meddelande: Error [141] C:\Users\Antom\Documents\c\test.c; 2.22 can't open include file "pic16f690.h": No such file or directory
den verkar inte hitta filen men filen ligger i den mappen, borde den ligga någonannanstans?

och sen när vi ändå är inne på detta har jag funderat på vad htc.h filen i "min" kod gör. Antar att det är något liknande pic16F690.h med inställningar i men jag vet inte var denna filen ligger så jag har inte kunnat kolla i den. Skumt att MPLAB hittar den filen som jag inte lyckats hitta och tvärt om.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: While loop i C

Inlägg av Icecap »

#include <pic16F690.h> betyder "inkludera filen pic16F690.h som ligger i det vanliga inkludera-bibliotek som är definierat i kompilern"

Skriv istället:
#include "pic16F690.h"
då det betyder "inkludera filen pic16F690.h som finns i samma bibliotek som källkodsfilen"
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: While loop i C

Inlägg av sodjan »

Alltså...

Jag har inte kollat, men visst fasen kommer väl MPLAB/Hitech med filer för
de processorer som de stöder ? D.v.s filen som "project_x" hänvisade till
borde väl redan ingå i Hitech installationen ? Man borde inte behöva hämta
dessa filer från ett annat ställe.

Och för övrigt så måste du ju redan ha en sådan, du använder ju t.ex "OSCCON" direkt.
Finns inte även de olika bitarna i t.ex PORTC definierade där ?

> har jag funderat på vad htc.h filen i "min" kod gör... men jag vet inte var denna filen ligger...

Hur har du letat ? Har du kört en Search på maskinen ?
Den skulle kunna ligga i någon biblioteksfil, men det är inte sannolikt att det är byggt så.
Så tillsvidare får vi säga att du inte har letat tillräckligt bra.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: While loop i C

Inlägg av Bola »

Jag har kört en sökning i datorn men inte fått fram nått, mycket skumt får jag säga. Oavsett så är inte det super viktigt just nu. Saker och ting fungerar.

Har en fåråga på denna koden (som jag faktiskt råkat göra själ därav säkert massa fel ;) )

Kod: Markera allt

#define _XTAL_FREQ  4000000
#include <htc.h>

unsigned char buttoncheck ();

void main() {

   OSCCON = 0x60; 
   ANSEL = 0;

  TRISB = 0xFF; //Input
   TRISC = 0x00; //Output

	while (1){
		PORTC =buttoncheck();
}

}

unsigned char buttoncheck (){
		unsigned char button;
		button=PORTB&0x0F;
		return(button);

}

Jag har dock en annan fråga. Kollar lite på ingångar nu har jag fattat det rätt att PORTB&0x0F läser in värdet på pinnarna som är ställda till 1:or (0F=11110000). Och kollar om dessa är höga eller låga?

button=PORTB&0x0F; detta ger alltså att button är lika med 0100 om en knapp exempelvis är nedtryckt eller? och om den genererar 0100 så kommer det alltså stå PORTC=0100 och inget kommer händ för det inte är ett hexadecimtal eller?

Kan tilläga att koden inte verkar fungera eller så har inte jag förstått riktigt hur den hänger ihop (flekoppling av mig isåfall). Har en knapp inkopplad till RB4 och en lysdiod till RC0
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: While loop i C

Inlägg av Icecap »

*suck* 0x0F är 00001111, inte 11110000!

Och '&' är en bitnivå AND så det betyder att den maskar ut de 4 knappar och set'er alla oanvända bits till 0.

Programstumpen läser alltså PORTB, AND'ar sedan med 0x0F för att nolla de 4 översta bits.

Och din sökning... har du sökt efter "htc.h" eller?
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: While loop i C

Inlägg av Bola »

*suck* 0x0F är 00001111, inte 11110000!
Jag skrev fel där, men nu har jag faktiskt greppat det där med hexadecimala och binäratal.
Programstumpen läser alltså PORTB, AND'ar sedan med 0x0F för att nolla de 4 översta bits.
och dom andra 4 bitsen nollas om inte exempelvis en knapp är ned tryck. Så om en knapp är nedtryck så blir värdet i button=00000001 och i while loopen kommer det stå PORTC = 00000001; har jag hängt me där? Om inte vad är det då som skickas med i button?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47010
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: While loop i C

Inlägg av TomasL »

Föreslår att du tankar ned Learn C with FED Den är visserligen avsedd att gå ihop med FED's utvecklingsmiljö, men är faktiskt rätt bra.
En annan bok du "SKALL" ha bredvid din dator är bibeln dvs K&R "The C Programming Language" samt den tillhörande "Solutions", finns även på Svenska.
Det är bra ide att ha både den Svenska och den Engelska orginalversionen.

Andra saker du behöver, eftersom du försöker dig på att skriva program för PICar är "The Quintessential PIC Microprocessor", vilken du kan hämta på min manualsida, http://www.ebaman.com.
Du behöver dessutom lära dig att räkna både binärt och hexadecimalt.
Nu vet jag inte riktigt vilken Processor du jobbar med, men att lära sig databladet mer eller mindre "utantill" är också en nödvändighet.
Skriv svar