Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage



Ralf2
16.08.2008, 13:38
Hallo zusammen,

Hab jetzt das RN-Control und fühle mich etwas erschlagen. Hab mir zwar schon diverse Artikel im Wissensbereich durchgelesen, fühle mich aber noch nicht so sicher, als ob ich das erste Programm zum laufen bringen würde. Gibts irgendwo ein gutes Tutorial, was einem vom Auspacken bis zum Übertragen des ersten Programmes begleitet? Grad das Einstellen der Compiler usw. weiß ich nicht, obn ich dies vollständig habe oder da was fehlt. Ich würde am liebsten mit Win-AVR programmieren, aber zu BASCOM wäre auch schön :)

Und noch eine Frage zum Thema Stromanschluß. Wollte den wandler von meiner externen Festplatte nutzen. Bei Output steht 12V und 2A. Die 2A sind aber bestimmt als Maximalstrom zu verstehen, oder? Demzufolge sollte der ja reichen als Stromversorgung. Jetzt hat der aber so einen runden Stecker (s. bild unten). Und ich bin grad am knobeln, wie ich es am besten hinkriege, damit ich am ende 2 Kabel hab, ich ich anklemmen kann. Wie habt ihr das gelöst? Alternativ hab ich noch ein 9V Batterie hier. Aber steht leider nicht drauf was die an Strom liefern kann. Sollte so eine Batterie reichen, wenn man zu Anfang grad nur die integrierten LEDs ansteuern will?

Hier nochmal das Bild, so sieht mein Anschluß auch aus.
https://www.roboternetz.de/wissen/images/a/a8/Avrtutorial_netzger%C3%A4t.jpg

Christopher1
16.08.2008, 14:32
Hi,
das Tutorial hier ist doch garnicht schlecht im Wiki, schonmal bisschen drin gelesen?
Für C: https://www.roboternetz.de/wissen/index.php/Kategorie:Quellcode_C
Für Bascom: https://www.roboternetz.de/wissen/index.php/Kategorie:Quellcode_Bascom

http://halvar.at/elektronik/mikrocontroller_wie_anfangen/
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/programmer/
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.mikrocontroller.net/articles/AVR-Tutorial

Ja, 2A ist die max Stromstärke die das Netzteil verträgt.
Naja das ist ein Stecker, da wär wohl eine Buchse nicht das Schlechteste oder? ;-)
http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=C195;GROUPID=3258;ARTICLE=35 274;START=0;SORT=artnr;OFFSET=16;SID=27ZUqrKqwQARs AACzgXqAe098efecbf77680c2a5fa766c7646f65 (gibts auch in 2,1mm)
Das sollte ein 9V Block schaffen, aber auf Dauer ist ein Netzteil wohl sinnvoller.
Wenn du das Netzteil nicht mehr für andere Dinge benötigst, könntest du den Stecker auch einfach abschneiden ;-)

Ralf2
17.08.2008, 18:26
Hallo Christopher1,

danke für deine Antwort. Ja, Wiki hab ich am Anfang schon gelesen, und das hat mich am Anfang ein bisschen erschlagen. Aber mittlerweile hab ich einen guten Überblick, denk ich . Gibt wirklich sehr viel gute C-Quellcodes, die sind mir erst garnicht so aufgefallen. Die anderen Links werde ich mir die nächsten Tage in ruhe mal anschauen. Aber schonmal danke dafür :)

Hm...Buchse, ja gute Idee. Aber noch besser war der Vorschlag einfach den dummen Stecker abschneiten :D Hab ein altes Handyladegerät gefunden mit 7.5V und 0.4A, das reicht fürs Erste. Keine Ahnung wieso ich selber an sowas nicht gedacht habe ^^ Was passiert eigentlich wenn das Board im Betrieb zu wenig Strom erhält? Fallen erst einzelne Komponenten aus, die am meisten brauchen oder geht es quasie sofort komplett aus?

Hab noch 2 fragen zur programmiertechnischen Seite.

Wenn ich schreibe:

DDRC = 0xFF;

klappt das wunderbar. Nun weiß ich allerdings laut Datenblatt, das DDRC bei 0x34 ist.Wieso klappt es dann nicht, wenn ich

0x34 = 0xFF;

schreibe? Muss ich da noch was mit Pointern beachten, obwohl ich das eigentlich kaum glaube. In der Include ist ja DDRC mit 0x14 deklariert und der Offset dafür ist ja 0x20. Das macht nunmal 0x34, genau wie es im Datenblatt steht.

Zu meinem zweiten Problem. Gleich eins vorneweg, mir fehlt das Kabel, um Daten auf den PC anzeigen zu lassen. Jetzt hab ich ein Programm geschrieben, was bei drücken eines Tasters eine bestimmt LED-Sequenz abspielen soll. Jetzt scheint es wohl so zu sein, die Spannungen durch die Taster an PORTA7 von Board zu Board unterschiedlich sind? Liege ich da richtig? Muss ich also so lange mit den Grenzen rumspielen bis es hinkommt?
Erst dacht ich das liegt an der Frequenz für den ADC. Aber ich hab im Makefile die 16MHz und für ADPS ein Vorteiler von 128. Und wenn ich im Makefile auf 1MHz stele, reicht es aus wenn ich den Vorteiler auf 8 stelle?

zerush
17.08.2008, 18:36
Versuchs mal so:

*((unsigned char*)0x34) = 0xFF

Das Macht dir aus 0x34 nen Pointer, der auf 0x34 zeigt. Und der * davor dereferenziert diesen dann wieder.

Zur Frequenz:
Diese stellst du NICHT im makefile ein, sondern ausschließlich über die Fusebits und ggf. über den angeschlossenen Quarz. Im makefile muss dies dann daran angepasst werden!

Die Spannungen der Taster können aber durchaus variieren. Daher solltest du am Anfang einfach mal ein paar Kalibrierungsmessungen machen. Du könntest ja z.B. den aktuellen Messwert einfach an den LEDs ausgeben...

Gruß,
Thomas

Ralf2
17.08.2008, 19:14
Hallo zerush,

danke für die schnelle Antwort. Das mit den Pointern werd ich dann mal so probieren, aber im Endefekt fährt man mit den Platzhaltern wohl doch viel besser.

Ich hab grad mal die Spannung gemessen, die anliegt wenn ich die einzelnen Taster drücke. Hab da Werte um 1.65V für T1 bis 0.45V füt T5. Nun sind das in dem Beispielprogrammen aber wesentlich andere Bereiche. Sind meine Werte realistisch? Hab die auch grad mal probiert und es hat sich nix geändert. Er wechselt spontan zwischen Taster 3 - 5.
Mir fällt grad auf, der wandelt die Spannung ja von alleine in eine uint16_t. Da bräuchte ich ja nur 1 uint16_t wert und die Spannung und kann mir den Rest selber ausrechnen. Weiß jemand wie grad die maximale Spannung ist, die er in den Wert rein bekommt?

Zu der Taktfrequenz. Kann man die auch mit WinAVR ändern? Warum ist CKSEL=1111 für den 16MHZ Quarz das richtige? In der Beschreibung erkenne ich nichts, was darauf hindeutet. Was bedeutet allgemeint Start up time: x CK + y ms? Ist y die Zeit bevor er überhaupt anfängt und x die Takte, die er zum einschwingen braucht? ODer wie muss man das ganze verstehen? Kann ich bedenkenlos alle Int. RC Osc. auswählen? Macht das der Atmel mit? Und nur bei Ext. darf ich nur den einen nehmen, der für den 16MHz Quarz gedacht ist?
Oder macht es aus Engietechnischer Sicht fast keinen Sinn, den Controller runterzutakten, wenn man könnte?

zerush
17.08.2008, 19:28
Zu den Pointern. Du solltest immer wenn möglich die definierten Platzhalter verwenden (also PORTC, PINA, ADMUX, ...). So sieht man, was gemeint ist, und es funktioniert meistens auch, wenn man mal den Controller wechselt!

Also die maximale Spannung ist Vref (abhängig von der ADC Einstellung und dem Jumper vom RN-Control) und ergibt dir dann als Wert 1024.
Wenn also die Einstellungen die externe Referenzspannung verwenden, und dort 5V anliegen, dann entsprechen 5V am ADC-Pin 1024.

Die Startup-Time ist dafür da, dem Quarz ein wenig Zeit zu geben, bis es sich eingeschwungen hat, damit du dann eine stabile, gleichmäßige Frequenz bekommst.
Die internen RC Osc. kannst du alle bedenkenlos auswählen, wenn du jedoch einen Quarz dran hast, ist es empfehlenswert, diesen auch zu benutzen (bis zu 16MHz möglich und wesentlich genauer!!). Klar, umso langsamer er läuft, umso weniger verbraucht er auch.

Du musst halt noch aufpassen, dass du Ext. Chrystal wählst und nicht Ext. Clock oder Ext. Oscillator. Dann brauchst du nämliche nen externen Takerzeuger. Also einen anderen Controller oder einen Quarzoszillator!

mfg,
Thomas

Ralf2
17.08.2008, 19:58
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>


int main(void){

DDRC = 0xFF;
PORTC = 0xFF;


uint16_t wert = 0;
//vorteiler 128
ADCSRA = (1<<ADEN)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

//REFS1:0 AREF, Internal Vref turned off: wurde in den beispielprogrammen genauso gewählt
//single endet input
ADMUX = 7;

//Analog comperator, richtig wenn es von alleine auf Tastendrck triggern soll?
SFIOR = (1<<ADTS0)|(0<<ADTS1)|(0<<ADTS1);

//keine Taste gedrückt
while(ADCSRA & (0<<ADSC)) {}
//taste gedrückt, hat angefangen zu wnadeln
while(ADCSRA & (1<<ADSC)) {}

wert = ADCW;


ADCSRA &= ~(1<<ADEN);

//wie bekomme ich die untersten 8bit von 'wert' auf meine 8 LEDs?
PORTC = 0x00;
}

Ich wollte mir jetzt ein kleines Programm schreiben, was automatisch triggert wenn eine Taste gedrückt wird.nach der Wandlung sollen die unteren 8 Bits auf den LEDs ausgegeben werden.Wie ich das mit den Bits machen weiß ich noch garnicht, aber das automatische Triggern funktioniert schon nicht (LEDs leuchten ohne das Taste gedrückt wird).

Ich hoffe mal mein ADCSA Stimmt schonmal. Beim ADMUx das REFS1:0 bin ich mir nicht sicher, ob das so stimmt, aber in den Beispielen war es auch immer so. Welche Spannung ist denn AREF? Bei dem SFIOR bin ich mir auch recht unsicher. Und kann man das dann mit den beiden whileschleifen so machen?


Zu den Pointern. Du solltest immer wenn möglich die definierten Platzhalter verwenden (also PORTC, PINA, ADMUX, ...). So sieht man, was gemeint ist, und es funktioniert meistens auch, wenn man mal den Controller wechselt!

Also die maximale Spannung ist Vref (abhängig von der ADC Einstellung und dem Jumper vom RN-Control) und ergibt dir dann als Wert 1024.
Wenn also die Einstellungen die externe Referenzspannung verwenden, und dort 5V anliegen, dann entsprechen 5V am ADC-Pin 1024.

Die Startup-Time ist dafür da, dem Quarz ein wenig Zeit zu geben, bis es sich eingeschwungen hat, damit du dann eine stabile, gleichmäßige Frequenz bekommst.
Die internen RC Osc. kannst du alle bedenkenlos auswählen, wenn du jedoch einen Quarz dran hast, ist es empfehlenswert, diesen auch zu benutzen (bis zu 16MHz möglich und wesentlich genauer!!). Klar, umso langsamer er läuft, umso weniger verbraucht er auch.

Du musst halt noch aufpassen, dass du Ext. Chrystal wählst und nicht Ext. Clock oder Ext. Oscillator. Dann brauchst du nämliche nen externen Takerzeuger. Also einen anderen Controller oder einen Quarzoszillator!

mfg,
Thomas

Also für den Ext. Crystlar/Resonator kan nich nur High, Medium und Low einstellen. Das dann das High die 16MHz sind erschient logisch. Woher weiß ich nun wieviel Medium und Low genau ist?

Also an den Jumper hab ich nix gemacht. Und die Einstellung hatte ich immer, wie in dem Beispiel oben, nur ihne der versuchten Autotriggerung. Also genau so wie es auch in den Testprogrammen war. Und woher weiß ich jetzt das Vref? Sorry, aber irgendwie blicke ich da noch nicht ganz durch.

Ralf2
25.08.2008, 16:39
Hallo,

kann mir wirklich niemand bei meinem Programm helfen?

mfg
Ralf

Hubert.G
25.08.2008, 20:03
Für die Fuseeinstellungen:
Low bis 3MHz
Medium bis 8MHz
High bis 16MHz Hier sollte auch CKOPT aktiv sein
Ich habe mir dein Programm nicht angeschaut ob es so funktioniert aber die Ausgabe auf die LEDs PORTC = wert;
Ab //keine Taste gedrückt gehört das ganze in eine Endlosschleife sonst läuft es genau einmal und so schnell kannst du nicht drücken.