PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Allgemeine Fragen



BlackDevil
25.07.2008, 19:15
Hi

Normalerweise bemühe ich mich als Titel das zu verwenden was ich auch erfragen möchte. Da das alles nicht dort oben reinpasst der schlechte opener.

Also:
- Was sind die Unterschiede zwischen 32bit und 64bit Programmierung? Soll hier um PC wie auch embedded Systems mit ARM CPUs gehen.

- OOP bzw Klassenorientiere Programmierung auf einen Microcontroller. Macht das sinn? Macht es sinn eine "gliedmaßen.c" zu erstellen in der die Klasse Gliedmaßen mit samt Konstruktor und Co steckt sodass ich später nur sagen muss<pre>
Gliedmaßen Bein = new Gliedmaßen;
Bein.bewegen_fwd(10)</pre>
Sodass sich das Bein 10s nach vorne bewegt. Oder verbraucht diese Art der Programmierung zuviel Speicher?

- Digitale/Analoge Servos. Der Unterschied besteht doch eigentlich nur darin, das die Digitalen einen Poti eingebaut haben und direkt an den µC angeschlossen werden können - oder? Und wie sieht die Programmierung aus - sodass ich sagen kann "Beweg dich 10° nach vorne und dann wieder -30° nach hinten"?

- Timer - gibt es ein gescheites Tutorial zum Thema Timer? Das GCC Tutorial bei µC Reicht mir da einfach nimmer *g*

- Was sind die geheimnisse eines ISP mit Mega8? Eigentlich sind alle das gleiche - ich könnte Theoretisch einen fertigen Schaltplan nehmen, ihn um Optokoppler am Ausgang und ihn so versehen das er Intern/Externe Spannung abkann und und verkaufen (Theoretisch)? Oder?


Ich glaub das war alles :) Grüße

Foooob
26.07.2008, 14:42
Hi

Ich nehm mich mal ein paar Fragen an ;-)




- OOP bzw Klassenorientiere Programmierung auf einen Microcontroller. Macht das sinn? Macht es sinn eine "gliedmaßen.c" zu erstellen in der die Klasse Gliedmaßen mit samt Konstruktor und Co steckt sodass ich später nur sagen muss<pre>
Gliedmaßen Bein = new Gliedmaßen;
Bein.bewegen_fwd(10)</pre>
Sodass sich das Bein 10s nach vorne bewegt. Oder verbraucht diese Art der Programmierung zuviel Speicher?


Ob es Sinn macht hängt von der Anwendung ab, gehen tut es.
Es gibt sicher Anwendungen, bei denen die Features von C++ schön zum Einsatz kommen können. Gerade Dinge wie Exception Handling.

Andererseits braucht C++ in der Regel mehr Speicher als C. C ist für eine Hochsprache einfach extrem hardwarenah und verzichtet auf vieles bzw. lässt es dem Programmierer frei wie er seinen Code "aufplustern" will.
C++ ist (wenn man von den Standard-C-Operatoren usw. absieht) weiter von der Zielhardware entfernt. Das geht teilweise sogar so weit, dass das Exception Handling auf den µC "draufgepackt" wird obwohl es nicht benutzt wird.





- Digitale/Analoge Servos. Der Unterschied besteht doch eigentlich nur darin, das die Digitalen einen Poti eingebaut haben und direkt an den µC angeschlossen werden können - oder? Und wie sieht die Programmierung aus - sodass ich sagen kann "Beweg dich 10° nach vorne und dann wieder -30° nach hinten"?


Analoge und Digitale Servos kann man beide direkt an den µC anschließen.
Der große Unterschied der beiden liegt darin, dass analoge Servos mit einem PWM Signal alle 20ms angesteuert werden, digitale jedoch alle 400µs!! Damit entwickeln die digitalen ein höheres Drehmoment und sie können viel schneller reagieren.

Die Programmierung machst du mit Timern. Z.B. alle 20ms einen Puls bestimmter Länge senden. In welchen Intervall diese Länge liegen muss steht im Datenblatt des Servos.




- Timer - gibt es ein gescheites Tutorial zum Thema Timer? Das GCC Tutorial bei µC Reicht mir da einfach nimmer *g*


Datenblatt ;-)
Dort sind alle Möglichkeiten zum Einsatz der Timer aufgelistet. Einfach mal etwas Zeit nehmen und einarbeiten.

error41
26.07.2008, 17:13
Hi!
Also ich fand das englische Timer-Tutorial von Avrfreaks gut:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106

Gruß

BlackDevil
26.07.2008, 17:49
Hi!
Also ich fand das englische Timer-Tutorial von Avrfreaks gut:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=zeigebeitrag&t=50106

Gruß

Ich schau mir das mal an, danke.

Zu 1: Gibt es keine Klassen in C? Ich habe C++ gelernt und damit noch nicht wirklich den Plan von C (so doof das Klingt)...

Zu 2: Das heist beide Steuer ich mit einem PWM Signal an, das war klar. Die Digitalen haben afaik 3 Leitungen: Masse, VCC und Signal - an Signal lege ich dann mein PWM Signal an, nehme ich an? Gibts dazu was zu lesen (in C)?

Zu 3: siehe oben :)

Danke soweit

kater
26.07.2008, 22:19
Digitale Potis, oder mache davon können doch eine Rückmeldung geben wo sie grade positioniert sind.

Foooob
27.07.2008, 02:28
Zu 1: Gibt es keine Klassen in C? Ich habe C++ gelernt und damit noch nicht wirklich den Plan von C (so doof das Klingt)...


Nein. C ist nicht objektorientiert. Das muss es aber auch gar nicht sein. Bei PC Programmen macht objektorientiertes Denken durchaus Sinn, für die µC-Programmierung braucht man es aber eigentlich nicht. Ich hätte jetzt noch nie sagen können, dass bei einer Anwendung OOP nützlich wäre. Genauso beim Exception Handling, das ich bei µC in dem Sinne (wie es bei C++ realisiert ist) für total überflüssig halte.
Ist ein Code richtig durchdacht und sauber programmiert kann es einfach zu keinen Ausnahmefällen kommen.

BlackDevil
27.07.2008, 09:49
Exception handling ist dann Sinnvoll wenn der Benutzer eine Eingabe machen soll, irgendein Wert überlaufen könnte, eine Rechnung durchgeführt werden soll oder wenn mit Dateien gearbeitet wird. Gibt sicher noch mehr aber da macht es sinn - finde ich.

Gut dann keine Klassen am µC :). Das Timer Tutorial les ich mir heute weiter durch, das ist ja gigantisch Oo
Danke

Foooob
27.07.2008, 12:36
Exception handling ist dann Sinnvoll wenn der Benutzer eine Eingabe machen soll, irgendein Wert überlaufen könnte, eine Rechnung durchgeführt werden soll oder wenn mit Dateien gearbeitet wird. Gibt sicher noch mehr aber da macht es sinn - finde ich.

Gut dann keine Klassen am µC :). Das Timer Tutorial les ich mir heute weiter durch, das ist ja gigantisch Oo
Danke

Wenn der Benutzer eine solche Eingabe machen kann, dass es zu einer Ausnahme/einem Fehler kommen kann ist das einfach schlecht programmiert. Genauso bei den anderen Fällen.
Ich sehe das eher noch als Gefahr für Anfänger. Denn anstatt sauberen und sicheren Code zu machen und solche Gefahren schon von Beginn an keine Grundlage zu geben wiegt man sich in der Sicherheit, dass das Exceptionhandling das schon alles machen wird.

BlackDevil
27.07.2008, 13:05
Wenn du allerdings irgendeine Rechnung machen sollst und den Fall "Division durch Null" abfangen willst oder mit Dateien Arbeitest, da könnte eine ja Kaputt sein und sich nicht Öffnen lassen, macht das schon Sinn und dort ist der Anwender nicht zwingend Schuld, oder dein Code ;)

Foooob
27.07.2008, 13:22
Wenn du allerdings irgendeine Rechnung machen sollst und den Fall "Division durch Null" abfangen willst oder mit Dateien Arbeitest, da könnte eine ja Kaputt sein und sich nicht Öffnen lassen, macht das schon Sinn und dort ist der Anwender nicht zwingend Schuld, oder dein Code ;)

Naja...
Um bei Rechnungen den Fall "Division durch Null" abzufangen reicht auch eine simple Prüfung des Nenners auf diese Bedingung. Das hat man in wenigen Codezeilen. Natürlich geht das auch mit Exception-Handling aber das finde ich eher umständlich, weil man dadurch noch einen alternativen Programmpfad einfügt usw usf...

Mit Dateien ist das etwas anderes, da kann es wirklich nützlich sein. Aber wo arbeitet man im µC-Bereich, speziell Robotik mit Dateien? Das sind sehr wenige Anwendungen.
Aber selbst dort kann man Exceptions relativ bequem umgehen. Es ist ja nicht so, dass wenn sich eine Datei nicht öffnen lässt (weil sie zum Beispiel gar nicht existiert) gleich dein gesamtes Programm abschmieren muss.

Es gibt bei reinem C spezielle Funktionen zum Arbeiten mit Dateien. Und diese liefern Rückgabewerte. Stimmt also etwas nicht liefert die Funktion den entsprechenden Rückgabewert (zum Beispiel EOF) und auf diese Ausnahmen kann man dann gezielt reagieren.

BlackDevil
27.07.2008, 15:47
Klar, man kanns auch anders lösen aber
<pre>
try{
// irgendwas
} exception ( // Ausnahme ) { // MIST! }</pre>

Ist nicht viel umständlicher. Ist geschmackssache denk ich :)


Edit:
Folgendes Problem
<pre>#include <avr/io.h>
#include <stdint.h>

int main(void){
DDRB |= (1 << 0); // Set LED as output
TCCR1B |= (1 << CS12); // Set up timer at Fcpu/64

for(;; ){
if(TCNT1 >=62500){
PORTB ^= (1 << 0); // Toggle LED
TCNT1=0;
}
}
}
</pre>

Meinen berechnungen zur folge müsste die LED 1mal Pro Sekunde Blinken. Das würde sie aber, laut Simulation, einmal in einem Jahr machen. Der Counter zählt Munter hoch und würde das bis zu 62500 tun... Takt ist 16Mhz

Auf die 62500 komme ich mithilfe des AVR Freak Tutorials und der Formel die dort steht
<pre>clc
clear

Target_Frequency=1;
Prescale = [1 8 64 256 1024];
Input_Frequency = 16e6;

for m=1:5;
Target_Timer_Count = (1 / Target_Frequency) / (Prescale(m) / Input_Frequency)
end</pre>

hab das dann mit MatLab berechnet und gesehen "Aha, 16bit Timer kommt sowieso in Frage, Prescaler nehm ich den 256er weil der perfekt in den 16bit Timer passt und gut...

Oder liegt das an der Simulation?

Foooob
27.07.2008, 21:46
Hi

Nutze bitte oben den CODE-Button, dann sieht der Code wesentlich leserlicher aus. ;-)


Was du machst ist ziemlich umständlich...
Timer sind dazu gedacht, dass sie neben dem Hauptprogramm laufen und sich dann melden, wenn ein entsprechendes Event aufgetreten ist.
Du startest einen Timer und frägst ihn permanent auf seinen Wert ab, anstatt ihn ackern zu lassen und sich von selbst via Interrupt zu melden oder über die OCx Pins das Signal nach außen weiterzuleiten.

Ich habe so einen Code noch nie genauer analysiert und kann dir auf die schnelle auch nicht sagen was daran falsch ist. Vielleicht liegt das Problem darin, dass du den Registerwert von TCNT1 ständig ausliest. Obwohl das laut dem Datenblatt keine Probleme machen dürfte (nur beim Schreiben kanns die geben).


Mit der von dir angegebenen Formel werde ich auch nicht schlau was du damit machen willst.


Okay, versuche einmal systematisch nur anhand des Datenblatts vorzugehen. Irgendwelche vorgefertigten Formeln sind zwar schön und gut, aber da tippt man meist irgendetwas ein ohne den tieferen Zusammenhang verstanden zu haben.

Überlege dir zuerst was du mit dem Timer machen willst. Danach wählst du den Timer (8 oder 16 Bit) aus.
Danach überlegst du dir wie du den Timer verwenden willst. Soll er einen externen Takt (PWM) erzeugen oder nur intern softwareseitig helfen?
Wenn du einen ext. Takt willst dann musst du über das TCCRx Register und die COMx Bits die entsprechenden OCx Pins zuschalten. Willst du nur softwareseitig mit dem Timer arbeiten und einen software Interrupt auslösen dann musst du im TIMSK-Register das entsprechende Bit setzen.

War jetzt sehr allgemein, aber ich weis nicht wo genau dein Problem liegt.



Zu der Sache mit dem Exception-Handling noch



try{

// irgendwas

} exception ( // Ausnahme ) { // MIST! }


Der Code ist zwar nicht umständlich aber er braucht wie vorher schon sagte eben mehr Speicher.

sternst
27.07.2008, 22:20
Das würde sie aber, laut Simulation, einmal in einem Jahr machen.

Du hast nicht etwa erwartet, dass der Simulator in Echtzeit läuft, oder?
Die Laufzeit kannst du im Prozessor-Fenster unter "Stop Watch" beobachten.

error41
27.07.2008, 22:39
Hi!



Was du machst ist ziemlich umständlich...
Timer sind dazu gedacht, dass sie neben dem Hauptprogramm laufen und sich dann melden, wenn ein entsprechendes Event aufgetreten ist.
Du startest einen Timer und frägst ihn permanent auf seinen Wert ab, anstatt ihn ackern zu lassen und sich von selbst via Interrupt zu melden oder über die OCx Pins das Signal nach außen weiterzuleiten.

Das steht so im von mir erwähnten Tutorial, der Code ist bloß eine erste Einführung. Da wird noch keine ISR benutzt. Erst ein paar Beispiele weiter gehts richtig los. Insofern hast du recht, macht SO noch keinen Sinn. :cheesy:

BlackDevil
28.07.2008, 09:40
Hi!



Was du machst ist ziemlich umständlich...
Timer sind dazu gedacht, dass sie neben dem Hauptprogramm laufen und sich dann melden, wenn ein entsprechendes Event aufgetreten ist.
Du startest einen Timer und frägst ihn permanent auf seinen Wert ab, anstatt ihn ackern zu lassen und sich von selbst via Interrupt zu melden oder über die OCx Pins das Signal nach außen weiterzuleiten.

Das steht so im von mir erwähnten Tutorial, der Code ist bloß eine erste Einführung. Da wird noch keine ISR benutzt. Erst ein paar Beispiele weiter gehts richtig los. Insofern hast du recht, macht SO noch keinen Sinn. :cheesy:

Genau - Mit ISR gefällts mir auch besser aber ich wollte erst mal den Spaß so testen und anschauen. Und ja, ich hab gedacht der Simulator läuft halbwegs in Echtzeit, so würde ich ja Jahre brauchen um den Flasher zu Simulieren :D