PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren in C. Welche Software brauche ich?



Franky55555
23.01.2009, 15:08
Hi!


Ich hab in Bascom die ersten Gehversuche gemacht und es funktioniert auch das meiste. Aber nun möchte ich auf C umsteigen.
Erstens weil mein Freund auch C proggrammiert und mir helfen kann und zweitens weil man mit C ja mehr machen kann, als mit Bascom.

Hardwaremäßig habe ich schon folgendes:
-Atmega8 + Schaltung auf steckbrett, schon getestet mit Bascom
-MySmartUSB
-PC mit Windows XP

Aber was brauche ich an Software um in C zu programmieren?
Und könnt ihr mir ein gutes, leicht verständliches Tutorial empfehlen?

Ich bin für jede Hilfe dankbar.


MfG

Hubert.G
23.01.2009, 16:13
Schau dir mal das AVR-Studio an, das kannst du kostenlos von der Atmel-Seite herunterladen.
Als C-Tutorial ist das nicht schlecht: www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Franky55555
23.01.2009, 16:25
Kann ich auch WinAVR verwenden? Weil ich hab den Asuro und der wird ja auch mit dem programmiert. Ich habe gedacht, das AVR-Studio ist nur für Assembler.
Und kann ich mit WinAVR/AVR-Studio das programm uber den Mysmartusb übertragen?

Mixxer
23.01.2009, 16:59
Ja, kannst du.

Du kannst auch den avr-gcc in das AVR-Studio einbinden und dann mit dem AVR-Studio in C programmieren und simulieren.
Allerdings passieren da beim Simulieren ab und zu komische Fehler (zumindest bei mir)
MFG Mixxer

Besserwessi
23.01.2009, 18:12
WinAVR kann man sehr gut zusammen mit AVRStudio nutzen. Winavr soll aber auch ohne gehen.
Das Übertragen des Programms mit dem Mysmart AVR müßte auch gehen. Es wird ja erstmal ein .hex File erzeugt, und das kann man dann von der Programmiersoftware laden. Zur Auswahl hat man wenigstens AVRdude (aus Winavr), den Teil von BASCOM und die Ansteuerung direkt von AVRstudio (wird eher nicht mit mysmartusb gehen).

AVRdude ist von der Bedienung etwas kryptisch, weil es als Programm für die Kommandeozeile gedacht ist. Mit einer kurze Batchdatei passend zum eigenen Programmer / controller ist es aber nicht mehr so schlimm.

Franky55555
26.01.2009, 14:04
Also ich habe jetzt mal die Programme heruntergeladen und ich habe auch schon einen Code geschrieben aber beim Compilieren kommt folgende Fehlermeldung:

make: *** No rule to make target `../Test2.c', needed by `Test2.o'. Stop.

Warum denn?

Hier mein C-Code:



#include <avr/io.h>

int main (void)
{
DDRC = 0xff;
PORTC = 0x03;

while(1)
{

}


return 0;
}

Der sollte 2 Leds an PortC einschalten. Geht das so?

Hubert.G
26.01.2009, 14:27
Arbeitest du mit PN oder AVR-Studio. Bei PN hast du ein Problem mit den make-File.

robocat
26.01.2009, 14:29
hallo,
der code ist ok, was dir noch fehlt ist ein makefile. so heisst die datei (ohne endung), muss im selben verzeichnis wie dein quelltext liegen und beinhaltet zB, für welchen controller kompiliert werden soll, und wie die quelltextdatei(en) heissen.

in dem von Hubert.G genannten http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial steht einiges über makefiles. bei winAVR sollte auch eine makefile.exe dabei sein, die dies datei für dich erzeugen kann.

gruesse von der katz

Franky55555
26.01.2009, 14:46
Ich arbeite mit AVR-Studio, und da braucht man doch keine makefiles, oder?

Hubert.G
26.01.2009, 15:04
Dann hast du das AVR-Studio nicht richtig gestartet.
Du musst mit Projekt-neu starten und das vorgegebene alles einstellen, Projektname, GCC, welcher µC, dann sind alle Files richtig eingetragen und der Compiler richtig eingestellt.

Franky55555
26.01.2009, 16:26
Wow danke voll super von euch alles funktioniert!!!!
Vielen Dank

Franky55555
26.01.2009, 19:01
#include <avr/io.h>

int Time = 100000;

void main ()
{
while(1)
{
DDRC = 0xff;

PORTC = 0x01;
Wait(Time);
PORTC = 0x02;
Wait(Time);
PORTC = 0x04;
Wait(Time);
PORTC = 0x08;
Wait(Time);
PORTC = 0x10;
Wait(Time);
PORTC = 0x20;
Wait(Time);
PORTC = 0x20;
Wait(Time);
PORTC = 0x10;
Wait(Time);
PORTC = 0x08;
Wait(Time);
PORTC = 0x04;
Wait(Time);
PORTC = 0x02;
Wait(Time);
PORTC = 0x01;
Wait(Time);
}
return;
}

void Wait(int waitTime)
{
for(zaehler = 0;zaehler<waitTime; zaehler++)
{

}
return;
}

Man, nochmals ne Frage ich als Anfänger komm echt nicht weiter dieses Programm sollte eigentlich ein Lauflicht darstellen, trotzdem zeigt es nur dauerhaft leuchtende LEDs.
Hilfe Hilfe Hilfe
Hat wer ne Ahnung was falsch ist????

Hubert.G
26.01.2009, 19:47
Probier es mal damit
#define F_CPU 1000000UL // 1 MHz

#include <util/delay.h>

#include <avr/io.h>



int main (void){
DDRC = 0xff;


while(1)
{


PORTC = 0x01;
_delay_ms(5);
PORTC = 0x00;
PORTC = 0x02;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x04;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x08;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x10;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x20;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x20;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x10;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x08;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x04;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x02;
_delay_ms(500);
PORTC = 0x00;
PORTC = 0x01;
_delay_ms(500);
PORTC = 0x00;
}
return;
}

Das delay hat allerdings den Nachteil das der µC dort wirklich wartet. Besser wäre ein Timer.

robocat
26.01.2009, 20:20
nur als ergänzung:
in deinem code wird wahrscheinlich die leere for-schleife vom compiler wegoptimiert. wenn du mit asm("NOP"); einen befehl (in diesem fall einen tu-nichts-befehl) in die for schleife setzt, kann sie nicht mehr wegoptimiert werden.

es spricht aber nichts gegen Huberts code, und der vorteil ist, dass du ohne viel rechnerei zu halbwegs genau den wartezeiten kommst, du du willst.

gruesse

Besserwessi
27.01.2009, 17:11
Ja, es reicht die Frequenz einmal zu definieren.

Franky55555
27.01.2009, 17:16
Ich hab den Beitrag auf den Besserwessi geantwortet hat gelöscht, weil ich selbst draufgekommen bin :oops: . Tut mir leid!
Das nächste Mahl werde ich ihn einfach editieren.
Hier der Inhalt des Beitrags:

Das #define F_CPU 1000000UL in dem Code von Hubert.G kann ich weglassen, wenn ich die Frequenz im AVR-Studio eingestellt habe, oder?

Hubert.G
28.01.2009, 13:06
Nein, kannst du nicht, diese Frequenzangabe braucht das delay um die Zeiten richtig einzustellen.

Franky55555
30.01.2009, 19:58
Wie kann ich zwei Pins eines Ports ändern, aber die anderen so lassen wie sie sind?

Besserwessi
30.01.2009, 21:16
Um nur 2 Bits eine Prots zu ändern muß man den alten Wert auslesen und dann nur die Gewünschten Bits ändern: das geht z.B. so:
portB = (portB & Maske) | (~Maske & neu)

Dabei sind in Maske die Bits gesetzt die unverändert bleiben sollen. Auf die zweite und verknüpfung kann man eventuell verzchten wenn in neu alle Bits die bleiben sollen schon gelöscht sind.

Franky55555
31.01.2009, 11:00
Könnte bitte jemand ein Beispiel reinstellen?

edit:

ich hab jetzt ein bsp gefunden:



PORTC |= (1<<PC0) | (1<<PC2); // Pins PC0 und PC2 "high"

PORTC &= ~( (1<<PC0) | (1<<PC2) ); //Pins PC0 und PC2 "low"



Aber ich verstehe nicht ganz, was die Zeichen & ~ | < machen.

Hubert.G
31.01.2009, 13:51
Also was diese Zeichen anbelangt würde ich dir schon dringend raten ein C-Tutorial durchzuarbeiten. Diese und auch andere brauchst du dringend.
Wenn ich dir jetzt schreibe & ist ein Bitweise UND Operator und ~ ist ein Bit-Komplement-Operator weiss ich nicht ob du recht viel damit anfangen kannst.
| ist Bitweise ODER
< kleiner als
<< Links Shift

Franky55555
31.01.2009, 21:12
also, ich hab mal ein bisschen gegoogelt und herausgefunden was die zeichen bedeuten:

<< verschiebt Bit eine Stelle nach links.
| ist wie du schon gesagt hast oder
~dreht warheitswert aller bits um
& ist und

aber ich verstehe noch nicht wie das z.b. im folgenden beispiel zusammenhängt:

PORTC &= ~( (1<<PC0) | (1<<PC2) ); //Pins PC0 und PC2 "low"

askazo
31.01.2009, 21:36
Gut, nehmen wir das mal Stückchen für Stückchen auseinander.
Zuerst mal die Werte der Makros:
PC0 steht für 0
PC2 steht für 2

Ersetzt man die Makros im Beispiel, sieht das also so aus:
PORTC &= ~( (1<<0) | (1<<2) );

weiter gehts:
(1<<0) ergibt 00000001 binär (1 um null Stellen nach links schieben)
(1<<2) ergibt 00000100 binär (1 um zwei Stellen nach links schieben)

Jetzt steht da also
PORTC &= ~( 0b00000001 | 0b00000100 );

( 0b00000001 | 0b00000100 ) = 0b00000101 (bitweises oder)

Dann kommen wir auf
PORTC &= ~( 0b00000101);

Das Exclusiv-Oder (~) dreht alle Bits um:
PORTC &= 0b11111010;

a &= b ist eine andere Schreibweise für a = a & b also:

PORTC = PORTC & 0b11111010;

Das Ergebnis dieser Operation ist also, dass Die Bits 0 und 2 von PORTC auf 0 gesetzt werden, alle anderen behalten Ihren bisherigen Wert.

Jetzt klar?

Gruß,
askazo

Hubert.G
31.01.2009, 21:36
Das ist die nicht vereinfachte Schreibweise
PORTC=((1<<PC0)& ~(1<<PC0))
Damit wird dieses Bit auf 0 gesetzt. Die Zahl nach dem PC gibt an wie viele Stellen nach links geschoben wird.
Den Sinn dieser Bitoperatoren wirst du auch nur verstehen wenn du das ganze binär anschreibst.

askazo
31.01.2009, 21:40
@Hubert:
PORTC=((1<<PC0)& ~(1<<PC0)) hat aber nicht mehr viel mit dem Ursprünglichen Beispiel gemeinsam.... ;)

Hubert.G
31.01.2009, 21:46
Das Ergebnis ist allerdings das gleiche. Du hast es nur etwas schöner erklärt.

Franky55555
07.02.2009, 14:53
Vielen Dank für die ausführliche Erklärung!

Ich hab leider erst jetzt antworten können, weil ich die ganze Woche Skifahren war.

MfG

vklaffehn
07.02.2009, 16:53
Moin!
Mein Beileid..... schreckliche Sache, so Ski fahren :-)

Sorry für OT ;-)
MfG Volker