PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC in C programmieren



RolandS
06.10.2005, 09:49
Hallo Leute, ich habe folgendes Problem:
einen Pic conroller und keine ahnung von assembler :)
also mit keine ahnung meine ich das ich zwar weis das es assembler gibt, hab mir auch schon bei sprut die befehle usw durchgeschaut, aber ich bin irgendwie zu faul das ich mich so weit damit beschäftige das ich ein vernünftiges programm hinbekomme

gibt es eine möglichkeit das ding ganz "normal" in C zu programmieren? schein mir irgendwie um einiges einfach zu sein.

lion1984
06.10.2005, 11:05
hiho,

klar gibt es die, aber ich gebe mal meinen senf dazu und gebe dir 2 links, es kommen sicher noch mehrere links, aber ich kenne 2 mit dennen ich zufrieden bin:

http://www.cc5x.de/
und
http://www.fernando-heitor.de/

beide seiten beschäftigen sich mit PIC & C und sind deutschsprachig, natürlich gibt es auch massig eng. C Seiten, musst nur mit google danach suchen. hoffe die links helfen dir, ich hab sie als "einstieg" mal durchgelesen :)

RolandS
11.10.2005, 08:24
danke sehr, dieser cc5x compiler entspricht ca. meinen Vorstellungen, nur hab ich ein kleines problem damit :)

wenn ich das programm dann hineinflashen will, bekomm ich vom flashprogramm schon beim öffnen des HexFiles so ne meldung das ihm ne config oda so fehlt. ich hab dann mal versucht den kopf von nem funktionierenden beispiel programm ins asm file zu kopieren und dann nochmach ein hex zu erstellen, das funktioniert zwar, ist aber sehr umständlich :(
gibts da nix einfacheres?

tux1
11.10.2005, 09:18
Die "Akkumaschine" der 16-er-PICs ist nicht wirklich C-tauglich, da wirst Du auf Dauer nur mit dem Assembler glücklich werden. Damit Du mich nicht falsch verstehst, mittlere bis größere Projekte programmiere ich ausschließlich in C (bin kein Assembler-Fanatiker), verwende dabei aber keine PICs. Bei kleinen Projekten programmiert man (nach einer Einarbeitungszeit) mit dem schlanken RISC-Befehlssatz des PICs relativ zügig, außerdem hat den großen Vorteil (z. B. in der Sensorik) immer zu wissen, wie lange die einzelnen Prozeduren dauern (bis auf Sprungbefehle dauert jeder Befehl gleich lang und die Sprungbefehle um den Faktor 2 länger). Ich sehe aber natürlich ein, das Hochsprachen konfortabler sind!

RolandS
11.10.2005, 09:29
mir is schon klar das assembler schneller ist, aber nicht wenn man keine ahnung davon hat :)
aba nachdem der c compiler eh vorher in assembler umwandelt erhoff ich mir das i daraus lernen kann, nur löst das leider mein problem nicht das ich die programme nicht reinflashen kann :(

tux1
11.10.2005, 12:28
Welches Programm verwendest Du denn zum Flashen? In deinem hex-file scheint das "Configuration Word" zu fehlen, und ein nachträgliches Einstellen scheint nicht möglich zu sein. In Assembler sieht eine derartige Direktive folgendermaßen aus:

__CONFIG _CP_OFF&_WDT_ON&_PWRTE_ON&_XT_OSC

Wenn Du mir sagst, welches Programm Du verwendest, kann ich es ja mal austesten!

RolandS
11.10.2005, 12:37
jup, genau der fehler ist es
das ganze ist so ein einsteiger set von vellemann, da is ein programm dabei das heisst glaub ich picprog
wenns andere, schnellere/einfachere programme gibt bin ich nicht abgeneigt diese zu versuchen :)

tux1
11.10.2005, 13:15
Ok, mal die schlechte Nachricht:
Dieses Programm kann ich leider nicht auftreiben bzw. testen.

Aber ich hab auch ne gute Nachricht, hab mir nämlich den CC5x angesehen:
Man kann mit "#pragma"-Direktiven die Konfiguration in die C-Quelldatei einfügen, wie das funktioniert, steht in der Datei "config.txt" die im Ordner "cc5x\" liegt (dort wo die ganzen Header usw. liegen). Mit dieser Anleitung sollte es problemlos funktionieren. Berichte obs funktioniert hat.

RolandS
11.10.2005, 17:58
yeah, danke ich glaube es funktioniert jetzt, ich hab mir die adressen aus dem beispiel programm rauskopiert und in C "übersetzt"
vielen dank für die hilfe

RolandS
14.10.2005, 08:07
langsam merk ich das ich wirklich keine ahnung hab :)

neues problem :) :
ich schaff es mitlerweile, dass ich z.b ein lauflicht programmiere, also ausgänge schalte. nur wie kann ich einen eingang verwenden, also das er z.b auf tastendruck zählt ?? oder konkreter, wie kann ich die ports auf input schalten?
____________________
noch zur ergänzung, ich verwende da ein vellemann einsteigerset, mit nem 16F627

stowoda
16.10.2005, 07:48
Hey Roland!

Hast Du keine Ahnung wie Du Deine Ideen in C umsetzt oder Fehlt Dir das Hintergrundwissen was die 16F627 Architektur betrifft.

oder konkreter, wie kann ich die ports auf input schalten?
Bist Du Dir im Klaren was Register sind und wozu sie verwendet werden?

Gruß
lk

RolandS
16.10.2005, 13:06
bissal ahnung hab ich schon, nur gehts leider nicht so wie ichs mir gedacht habe.
soweit ich aus dem datenblatt rauslesen konnte, muss man zb mir dem "TRISB" register das Port B auf eingang setzten, nur funktioniert das irgendwie nicht so ganz.

bei den letzten versuchen bekomm ich auch immer nach dem flashen eine fehlermeldung, dass das configurationswort anders im speicher ist, als dass das gesetzt werden sollte :S

stowoda
16.10.2005, 16:12
Gruß!
Welchen PIC verwendest Du überhaupt??

.uups. War blind doch nun kannich wieder sehen! ;)

Du hast schon recht, TRISB ist verantwortlich für i/o des PORTB.
Wenn Du aber einen Taster anschliessen willst solltest Du die internen Pull-ups aktivieren.
Wenn Du impulse von außen auszählen willst, machst Du es über einen externen Interrupt. RB0 bietet Dir diese Möglichkeit.

Poste doch mal deinen Code, ich programmiere zwar in Assembler aber vielleicht findet sich jemand der Erfahrung hat.

RolandS
17.10.2005, 10:00
code posten ist leicht gsagt :) ich hab ja noch keinen.
zuerst hab ich einfach eine zählvariable immer weiterlaufen lassen und am Port B ausgegeben, und dann wollte ich machen, dass er nur bei gedrückter taste weiterzählt.
ich habs schon in nem simulator versucht, und mit dem vellemann kit aber es tut sich garnix.

RolandS
03.11.2005, 08:54
YEHAAA :)

ich hab mal einen anderen PIC versucht, und jetzt klappt eigentlich alles, auch wenn ich nicht genau weis warum :)
kann mir mal bitte jemand meinen code erklären :) ist aus beispielen zusammenkopiert (besonders die register am anfang versteh ich nicht ganz, weil ohne "CMCON=0b.0000.0111; " reagiert er auf die tasten nicht)


#include <16F627.h> // Prozessor-Typ definieren
#pragma config |= 0x3FFF & 0x3FFF & 0x3FFF &0x3FF7 &0x3FFB & 0x3F7F & 0x3FFF & 0x3FED // Konfigurationswort


void pause(uns16 ms) // Unterprogramm zum Abwarten einer
{ // angegebenen Anzahl von Millisekunden
while(ms) // Schleife verlassen, wenn ms=0 ist
{
OPTION = 2; // Vorteiler auf 8 einstellen
TMR0 = 131; // 125 * 8 = 1000 (= 1 ms)
while (TMR0); // Abwarten einer Millisekunde
ms--; // "ms" mit jeder Millisekunde erniedrigen
}
}

void main(void) // Start des Hauptprogramms
{
TRISB = 0b.1100.0000; // Pins RB0...RB7 -Ausgänge
TRISA = 0b.1111.1111;
OPTION_REG=0b.1101.0111;
CMCON=0b.0000.0111;
char Zaeler, i,a; // 8-Bit Variable (0...255)
char Schaltern ;
Sprungmarke:


Schaltern = PORTA & 0b.0000.1111 ;


switch(Schaltern)
{
case 1 : // wenn nur Schalter 1 betätigt ist
a=250; // tu dies
break;

case 2 : // wenn nur Schalter 2 betätigt ist
a=125; // tu das
break;

case 4 : // wenn alle Schalter betätigt sind
a=50; // tu jenes
break;
case 8 : // wenn alle Schalter betätigt sind
a=10; // tu jenes
break;
}


PORTB = 0b0000.0001 ; // Bit 0 von PortB setzen
for (i=0 ;i<5 ;i++) // folgende Befehle 8-mal wiederholen
{
PORTB = PORTB << 1 ; // 1 kommt ins nächste Bit links
pause(a); // jede LED halbe Sekunde leuchten lassen
}
for (i=0 ;i<5 ;i++) // folgende Befehle 8-mal wiederholen
{
PORTB = PORTB >> 1 ; // 1 kommt ins nächste Bit links
pause(a); // jede LED halbe Sekunde leuchten lassen
}
goto Sprungmarke; // Alles wiederholen
}

ein problem hab ich noch, jetzt reagiert das programm nur auf einen tastendruck wenn er zufällig grade an der programmstelle ist, wie kann ich das mit interupts machen das er immer reagiert ?

stowoda
03.11.2005, 16:50
Hey Roland!

Wie wärs mal mit ein wenig suchen und lesen??

Du musst den globalen Interrupt einschalten und im dazugehörigen Register die Interruptart wählen zB.:
Unterbrechung von aussen durch fallende Flanke an RA4.
Oder.. Unterberechung durch Pegeländerung am bestimmten Pin...
Wieso schaust Du nicht einfach ins Datenblatt, oder auf die schon zig fach genannte Seite www.sprut.de.

Ein wenig Eigeninitiative wäre angebracht, zumal Du dann auf eigene Erfolge Stolz sein kannst. ;)

YEHAAA :D

Gruß
lk

michas_rob
08.02.2007, 12:03
Hello an alle.

Habe ich richtig gelsen, du programmierst mit dem Vellemen V111 den PIC 16F627...

Denn ich hab das selbe Board mit dem selben PIC und möchte auch gerne mit C beginnen....

Klappt das bei dir, denn ich hab bis jetzt nur negative Resonanz bekommen und war schon auf der Suche nach einem anderen Board....

Würd mich über ein Feedback freuen

Michael

RolandS
09.02.2007, 07:50
velleman stimmt, aber das board heisst, P8048
ich habe mir von http://www.cc5x.de/ den compiler und die tools besorgt, mit denen gehts eigentlich ganz gut, wenn ich auch immer wieder auf probleme stoße weil ich mich einfach zu wenig mit dem Pic auskenne

PsiQ
11.02.2007, 18:28
velleman stimmt, aber das board heisst, P8048


schau mal noch da:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=26525
und da:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=26589

ich hatte mit dem velleman auch probleme beim programmieren
(dieser read write error)

bei mir lags an der spannung zum programmieren..
die wollen da ein ungeregeltes netzteil haben, was bis zu 15V bringt
wenn man da mit 12V rangeht machts bei manchen pics probleme.. mit dem pic16f876a gehts aber auch mit niedrigerer spannung am programmierpin als 12V...