Hast du eine "left" oder "substr"-Funktion, die von einem String die linken N Zeichen abschneidet? Dann kannst du ein Array mit den kompletten 60 Zeichen füllen, und nur die Anzahl Zeichen ausgeben, die dein Sekundenzähler angibt. Eine andere Variante wäre eine Schleife, die bis zum Sekundenzähler läuft, und bei jedem Durchlauf ein Zeichen ausgibt. Ist der Schleifenzähler durch 5 teilbar (" i%5 == 0" ) wird ein "|" ausgegeben, sonst ein '.'.Die Sekundenzählung kann man doch sicher in einer Funktion abfertigen? Hat jemand eine Idee?
Der AVR-/ARDUINO-Faden
Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese
Re: Der AVR-/ARDUINO-Faden
Re: Der AVR-/ARDUINO-Faden
Code: Alles auswählen
void draw_sec_bargraph(int S)
{
display.setCursor(0, 15);
for(i=0;i<S;i++)
{
if(!(i%15))//Wen durch 15 teilbar dann Maker
{
Diplay.print("|");
}
else//Sonst Punkt
{
Diplay.print(".");
}
}
//ggf. den Bereich der noch leer bleibt "aufräumen"
for(i=0;i<(128-S);i++)
{
Diplay.print(" ");
}
}
//END
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der AVR-/ARDUINO-Faden
Vielen Dank für die Antworten. War der richtige Denkanstoß. Nach Anpassung hat Anses Code geklappt - vielen Dank!
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der AVR-/ARDUINO-Faden
Nächste Hürde bei meiner Wortuhr, Zuweisung von festen Texten bei bestimmten Zeiten. Sorry, Gelegenheitsprogrammierer halt, aber ich partout eine deutsche Wortuhr auf einem Display statt LED-Matrix zusannenbauen.
Hab ich so versucht:
Aber hier geht die Anzeige nach Start der Uhr genau auf die Anzeige von Label2 und bleibt da. Wo hab ich jetzt die Klammern falsch gesetzt?
Oder kann man da besser ein Array oder sogar eine lib bilden, was man abfragt? Aber wie geht sowas?
Die Alternative war, jede einzelne in Frage kommende Anzeige mit if...print... platt auszugeben, funktioniert, aber das übersteigt sofort den Speicher des AVRs. Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?
Hab ich so versucht:
Code: Alles auswählen
if (m == 25 && h == 0 || h == 12) goto label1;
if (m == 25 && h == 1) goto label2;
{
label1:
display.clearDisplay();
display.setCursor(0, 0);
display.print("Es ist F \232 n f vor");
display.setCursor(3, 9);
display.print("H a l b E i n s" );
}
{
label2:
display.clearDisplay();
display.setCursor(0, 0);
display.print("Es ist F \232 n f vor");
display.setCursor(3, 9);
display.print("H a l b Z w e i" );
}
}
Oder kann man da besser ein Array oder sogar eine lib bilden, was man abfragt? Aber wie geht sowas?
Die Alternative war, jede einzelne in Frage kommende Anzeige mit if...print... platt auszugeben, funktioniert, aber das übersteigt sofort den Speicher des AVRs. Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?
Re: Der AVR-/ARDUINO-Faden
Der geht schon zu label 1, aber darunter ist label 2 und der part wird auch ausgeführt. Das heisst dein display zeigt ganz kurz fünf von halb ein an, uns dann fünf vor halb 2, so schnell das du es nicht siehst.
Aber mal im ernst willst du jede Permutation von Stunde und Minute einzeln behandeln ? Erstmal sind Stunde und Minute unabhängig, kann also anstatt mit quadrat nur mit Faktor 2 gebastelt programmiert werden, und noch einfacher wärs wenn du die stunden und minuten/5 direkt als look up index inner Tabelle nimmst.
Aber mal im ernst willst du jede Permutation von Stunde und Minute einzeln behandeln ? Erstmal sind Stunde und Minute unabhängig, kann also anstatt mit quadrat nur mit Faktor 2 gebastelt programmiert werden, und noch einfacher wärs wenn du die stunden und minuten/5 direkt als look up index inner Tabelle nimmst.
Re: Der AVR-/ARDUINO-Faden
Die interessante Fragestellung ist eher, warum die Goto-Methode Speicher spart. Das sollte sie eigentlich nicht...Die goto-Methode spart enorm Speicher, aber wo hab ich mich da verrannt?
Durch Aufteilung des Ganzen in "es ist x vor/nach" und halbe Stunden sollte sich der Code aber ausreichend verkleinern lassen, dass das in den Speicher passt.
Re: Der AVR-/ARDUINO-Faden
Uhhh.... Ich weiß, es gibt eine "operator precedence", ich hätte aber heftige Probleme nun zu sagen, wie diese Zeile wirkt ( was passiert z.b. bei m=24 und h=12 ?). Bei verschiedenen Operatoren in einer Zuweisung/Bedingung setze ich grundsätzlich entsprechende Klammern -> Es erleichtert zumindest das Lesen des CodesCode: Alles auswählen
if (m == 25 && h == 0 || h == 12) ...
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der AVR-/ARDUINO-Faden
Ja, ich bin so ein Spaghettiprogrammierer, man sieht auch immer wieder, dass ich aus der BASIC-Ecke komme,
Ich werde das mal nach ferdis Vorschlag neu sortieren...
Ich werde das mal nach ferdis Vorschlag neu sortieren...
Re: Der AVR-/ARDUINO-Faden
Ich habe eine RTC Typ DS1302Z hier liegen.
Der Code vom User Krodal im Arduino-Playground funktioniert,
wenn er direkt in der Sketch liegt.
Nun wollte ich aus dem Code eine Bibliothek machen.
Die Definitionen samt Deklarationen in eine Header-Datei, die Funktionen in eine cpp-Datei.
Schrieb man im Roboternetz.
Aber was mache ich mit der Struktur?
Das Setzen der Zeit über
hätte ich in eine Funktion verbaut und mit in die cpp-Datei gelegt.
Ich denke, da fehlt mir etwas Wissen zu den C++-Gerüsten
Der Code vom User Krodal im Arduino-Playground funktioniert,
wenn er direkt in der Sketch liegt.
Nun wollte ich aus dem Code eine Bibliothek machen.
Die Definitionen samt Deklarationen in eine Header-Datei, die Funktionen in eine cpp-Datei.
Schrieb man im Roboternetz.
Aber was mache ich mit der Struktur?
Code: Alles auswählen
typedef struct ds1302_struct
Code: Alles auswählen
memset ((char *) &rtc, 0, sizeof(rtc));
Ich denke, da fehlt mir etwas Wissen zu den C++-Gerüsten
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der AVR-/ARDUINO-Faden
Warum nimmst Du keine fertige Bibliothek, z. B. die von Adafruit?
Ich fingere auch gerade an dem Problem mit dem Stellen rum. Momentan stelle ich den RTC durch einen ganz kurzen Sketch über das Terminal, da kann man die Verzögerung fürs Hochladen einrechnen. Danach kommt das normale Programm auf den AVR und ernährt sich vom zuvor gestellten RTC.
Normalerweise holt man ja per lib die Zeit zum Zeitpunkt des Compilierens vom Rechner, aber das ist eben ungenau, je nach Länge des Compilierens/Hochladens. Noch besser würde ich ein manuelles Stellen des RTC per Hardwaretasten finden, aber das hab ich noch nicht raus. Aber solange die Batterie für den RTC geht, reicht ja eigentlich das Stellen per Terminal.
Ich fingere auch gerade an dem Problem mit dem Stellen rum. Momentan stelle ich den RTC durch einen ganz kurzen Sketch über das Terminal, da kann man die Verzögerung fürs Hochladen einrechnen. Danach kommt das normale Programm auf den AVR und ernährt sich vom zuvor gestellten RTC.
Normalerweise holt man ja per lib die Zeit zum Zeitpunkt des Compilierens vom Rechner, aber das ist eben ungenau, je nach Länge des Compilierens/Hochladens. Noch besser würde ich ein manuelles Stellen des RTC per Hardwaretasten finden, aber das hab ich noch nicht raus. Aber solange die Batterie für den RTC geht, reicht ja eigentlich das Stellen per Terminal.
Re: Der AVR-/ARDUINO-Faden
Weil keine andere funktioniert.
Edit 20:56: Gerade noch etwas gefunden, was funktioniert: https://github.com/msparks/arduino-ds1302
Edit 20:56: Gerade noch etwas gefunden, was funktioniert: https://github.com/msparks/arduino-ds1302
Re: Der AVR-/ARDUINO-Faden
naja. bei 1302 und 1307 kann man fast gleich weg lassen. - mehrere Minuten pro Tag sind keine Seltenheit. Nimm doch eine 3231
https://forum.arduino.cc/index.php?topic=377472.0
und die Lib geht jedenfalls: https://github.com/JChristensen/DS3232RTC
EdIt: Zahlendreher..
https://forum.arduino.cc/index.php?topic=377472.0
und die Lib geht jedenfalls: https://github.com/JChristensen/DS3232RTC
EdIt: Zahlendreher..
Re: Der AVR-/ARDUINO-Faden
Mit der bereits oben schon verlinken DS1302-Bibliothek von msparks habe ich noch ein Verständnisproblem.
Ich möchte die Zeit setzen - per Terminal.
Das Beispiel macht das in der Sketch wie folgt (ohne Terminal):
Im Headerfile steht dazu:
Ich habe dann versrucht, per Terminal
- einen String einzulesen -> funktioniert
- in Teilstrings zu zerlegen -> funktioniert
- die Teilstrings in uint8_t zu konvertieren -> funktioniert
Nur mit dem Day komme ich nicht klar.
Folgende Codeschnipsel aus dem Sketch:
Die Eingabe am Terminal zum Setzen lautet (\n -> newline-character)
Das kommt auch so im String temp an.
Es folgt
Sketch (in .ino umbenennen)
Das dürfte wieder auf ein C++-Verständnisproblem hinauslaufen - Was mache ich falsch?
Ich möchte die Zeit setzen - per Terminal.
Das Beispiel macht das in der Sketch wie folgt (ohne Terminal):
Code: Alles auswählen
// Make a new time object to set the date and time.
// Sunday, September 22, 2013 at 01:38:50.
Time t(2013, 9, 22, 1, 38, 50, Time::kSunday);
rtc.time(t); // setzt die Zeit
Code: Alles auswählen
// Class representing a particular time and date.
class Time {
public:
enum Day {
kSunday = 1,
kMonday = 2,
kTuesday = 3,
kWednesday = 4,
kThursday = 5,
kFriday = 6,
kSaturday = 7
};
// Creates a Time object with a given time.
//
// Args:
// yr: year. Range: {2000, ..., 2099}.
// mon: month. Range: {1, ..., 12}.
// date: date (of the month). Range: {1, ..., 31}.
// hr: hour. Range: {0, ..., 23}.
// min: minutes. Range: {0, ..., 59}.
// sec: seconds. Range: {0, ..., 59}.
// day: day of the week. Sunday is 1. Range: {1, ..., 7}.
Time(uint16_t yr, uint8_t mon, uint8_t date,
uint8_t hr, uint8_t min, uint8_t sec,
Day day);
uint8_t sec;
uint8_t min;
uint8_t hr;
uint8_t date;
uint8_t mon;
Day day;
uint16_t yr;
};
- einen String einzulesen -> funktioniert
- in Teilstrings zu zerlegen -> funktioniert
- die Teilstrings in uint8_t zu konvertieren -> funktioniert
Nur mit dem Day komme ich nicht klar.
Folgende Codeschnipsel aus dem Sketch:
Die Eingabe am Terminal zum Setzen lautet (\n -> newline-character)
Code: Alles auswählen
set20180313090100Tuesday\n
Es folgt
Code: Alles auswählen
Serial.println(temp); // Eingabe anzeigen zwecks Kontrolle, zum Jahr hin muss eine freie Zeile sein!!
// Eingabe zerschneiden in einzele Strings und diese zu uint8_t konvertieren
jahr = temp.substring(3, 7).toInt();
monat = temp.substring(7, 9).toInt();
tag = temp.substring(9, 11).toInt();
stunde = temp.substring(11, 13).toInt();
minute = temp.substring(13, 15).toInt();
sekunde = temp.substring(15, 17).toInt();
temp = temp.substring(17); // Tagesname mit newline in temporären String ablegen
// Länge Tagesname mit newline ermitteln
// newline brauchen wir nicht mehr
// newline abschneiden, nur den Tagesnamen behalten
temp.remove((temp.substring(17).length()) - 1);
wochentag = String("k" + temp); // dem Tagesnamen ein "k" voranstellen (siehe enum Day in Headerfile)
// so war das gedacht, funktioniert jedoch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, wochentag);
// no matching function for call to 'Time::Time(uint16_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, uint8_t&, String&)'
// so geht es auch nicht:
// Time t(jahr, monat, tag, stunde, minute, sekunde, Time::wochentag);
// 'wochentag' is not a member of 'Time' --> logisch, nur: wie drücke ich aus, dass der Inhalt von "wochentag" eingesetzt werden soll?
// so funktioniert das prinzipiell, nur der Wochentag lässt sich nicht setzen:
Time t(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
rtc.time(t);
// auch folgendes funktioniert nicht:
// rtc.time(jahr, monat, tag, stunde, minute, sekunde, Time::kTuesday);
rtc.halt(false); // RTC wieder laufen lassen
halten = false; // ein Merker für den Zustand, unkritisch
Serial.println(jahr);
Serial.println(monat);
Serial.println(tag);
Serial.println(stunde);
Serial.println(minute);
Serial.println(sekunde);
Serial.println(wochentag);
Re: Der AVR-/ARDUINO-Faden
Funktioniert die Wandlung von Day String zu int?
Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?
Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?
Re: Der AVR-/ARDUINO-Faden
Eben nicht.
Wenn ich den Tag als String einsetze, dann funktioniert es ja nicht mehr.
Oder verstehe ich deine Frage falsch?
Muss ich mal probieren.
Edit 18:11: Die Ausgabe funktionier schon, nur die Eingabe (setzen) funktioniert nicht mehr. Muss mir etwas mehr Verständnis besorgen.
Wenn ich den Tag als String einsetze, dann funktioniert es ja nicht mehr.
Oder verstehe ich deine Frage falsch?
Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?Warum kann man den Tag nicht auch einfach mit einer Zahl setzen?
Muss ich mal probieren.
Edit 18:11: Die Ausgabe funktionier schon, nur die Eingabe (setzen) funktioniert nicht mehr. Muss mir etwas mehr Verständnis besorgen.
Re: Der AVR-/ARDUINO-Faden
In den Stringsysconsol hat geschrieben:Du meinst, die Time-Funktion nicht ein enum erwarten lassen, sondern ein uint8_t?
Muss ich mal probieren.
Code: Alles auswählen
set20180313090100 2 \n
Alternativ kannst Du auch eine eigenen Funktion schreiben die aus "Tuesday" eine 2 macht und mit den anderen Tagen natürlich auch.
Geht auch mit Ersetzen im String.
Ich hätte das ganze mehr in dem Format gemacht:
Code: Alles auswählen
SetDate: 13.3.2018
SetWeekDay: 2
SetTime: 18:45:00
-einzelne Datensätze können getrennt geschrieben werden. Z.B. wenn man nur die Zeit ändern will.
-Schön übersichtlich
-Leicht zu implementieren aber nur wenn es um noch mehr ähnliche Datensätze gibt damit es sich lohnt.
Beim Interpretieren wird nach den jeweiligen Schlüsselwörtern gesucht. Die Schlüsselwörter geben dann auch gleich an wie der folgende Stringabschnitt zu verstehen ist. Die Trennzeichen sind auch hilfreich beim interpretieren.
Nur mal so als Anregung.
Re: Der AVR-/ARDUINO-Faden
So einfach (statt Tagesnamen die Ziffer schreiben) geht das nicht.
Da müsste man irgendwie umwandeln, was ich aber nicht hinbekommen habe.
Ich habe jetzt die Bibliothek abgeändert.
Damit funktioniert das ohne die Tage beim Namen zu kennen.
Die Umwandelei ist mir persönlich zu verkompliziert worden.
Wenn ich das Chaos bereinigt habe, kann ich das gerne hier einstellen.
Die Formatierung der Ausgabe (Reihenfolge von Jahr, Monat,...) ist ein geringeres Problem und bereits gelöst.
Danke!
Da müsste man irgendwie umwandeln, was ich aber nicht hinbekommen habe.
Ich habe jetzt die Bibliothek abgeändert.
Damit funktioniert das ohne die Tage beim Namen zu kennen.
Die Umwandelei ist mir persönlich zu verkompliziert worden.
Wenn ich das Chaos bereinigt habe, kann ich das gerne hier einstellen.
Die Formatierung der Ausgabe (Reihenfolge von Jahr, Monat,...) ist ein geringeres Problem und bereits gelöst.
Danke!
Re: Der AVR-/ARDUINO-Faden
Hier die modifizierte Bibliothek.
Im Beispiel-Ordner ist die Sketch zum Setzen der Zeit enhalten.
(ich hoffe, ich verstoße mit dem Einstellen nicht gegen irgendwelche Rechte)
Im Beispiel-Ordner ist die Sketch zum Setzen der Zeit enhalten.
(ich hoffe, ich verstoße mit dem Einstellen nicht gegen irgendwelche Rechte)
- Dateianhänge
-
- arduino-ds1302-wo-dayname.zip
- (151.71 KiB) 64-mal heruntergeladen
Re: Der AVR-/ARDUINO-Faden
Jungs, ich brauch mal eure Hilfe - meine C-Kenntnisse sind schon seit 20 Jahren verrostet.
Gegeben: 2 Stück 3D-Drucker und eine Käsefräse, alle 3 mit Arduino Mega 2560 und RAMPS.
Unterschied: der USB-Chip 1 x der 16U2 und 2 x der CH340
Plan: Es soll eine Handsteuerung für die 3 Geräte her, die ich einfach anstecken (bzw. zwischen PC und Maschinensteuerung rein stecke)
Lösung: Noch ein Arduino Mega mit dem USB-Host-Shield.
Kommunikation mit allen 3en klappt schon mal, aber: es müssen unterschiedliche Treiber für den 16U2 und die CH340 geladen werden.
Nachdem ich die Handsteuerung einfach umstecken können will, fällt jedes mal neu compilieren aus.
Frage: Kann mir irgendjemand helfen, diesen Sourcecode so umzustricken, dass der Arduino beim Start entscheiden kann, welchen Treiber er lädt? - gerne spendiere ich einen Schalter an einem Eingang, mit dem ich den gewünschten Treiber signalisiere.
Hauptproblem: Die Programmierer der beiden Libraries (cdcacm.h und cdc_ch34x.h) haben teilweise die gleichen Variablennamen verwendet - spießt sich also auch schon mal dort.
Library: https://github.com/felis/USB_Host_Shield_2.0
Zusätzlich sind noch die beiden angehängten Dateien für den CH340 notwendig (habe ich in einem japanischen Forum gefunden - Google Translate macht es lesbar: http://www.suke-blog.com/arduino_usb_ho ... ith_ch340/
Ich wäre für Hilfe sehr dankbar, denn das ist jedenfalls jenseits meiner Grenzen. - Bin froh, dass ich den Sourcecode so weit vereinfachen konnte.
Gegeben: 2 Stück 3D-Drucker und eine Käsefräse, alle 3 mit Arduino Mega 2560 und RAMPS.
Unterschied: der USB-Chip 1 x der 16U2 und 2 x der CH340
Plan: Es soll eine Handsteuerung für die 3 Geräte her, die ich einfach anstecken (bzw. zwischen PC und Maschinensteuerung rein stecke)
Lösung: Noch ein Arduino Mega mit dem USB-Host-Shield.
Kommunikation mit allen 3en klappt schon mal, aber: es müssen unterschiedliche Treiber für den 16U2 und die CH340 geladen werden.
Nachdem ich die Handsteuerung einfach umstecken können will, fällt jedes mal neu compilieren aus.
Frage: Kann mir irgendjemand helfen, diesen Sourcecode so umzustricken, dass der Arduino beim Start entscheiden kann, welchen Treiber er lädt? - gerne spendiere ich einen Schalter an einem Eingang, mit dem ich den gewünschten Treiber signalisiere.
Hauptproblem: Die Programmierer der beiden Libraries (cdcacm.h und cdc_ch34x.h) haben teilweise die gleichen Variablennamen verwendet - spießt sich also auch schon mal dort.
Library: https://github.com/felis/USB_Host_Shield_2.0
Zusätzlich sind noch die beiden angehängten Dateien für den CH340 notwendig (habe ich in einem japanischen Forum gefunden - Google Translate macht es lesbar: http://www.suke-blog.com/arduino_usb_ho ... ith_ch340/
Code: Alles auswählen
// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];
// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>
class MyAsyncOper : public CDCAsyncOper {
public: byte OnInit(ACM *pacm) {
LINE_CODING lc;
lc.dwDTERate = 250000;
lc.bCharFormat = 0;
lc.bParityType = 0;
lc.bDataBits = 8;
pacm->SetLineCoding(&lc);
}
};
USB Usb;
MyAsyncOper AsyncOper;
ACM Acm(&Usb, &AsyncOper);
//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
class MyAsyncOper : public CDCAsyncOper {
public: byte OnInit(CH34X *pch34x) {
LINE_CODING lc;
lc.dwDTERate = 250000;
lc.bCharFormat = 0;
lc.bParityType = 0;
lc.bDataBits = 8;
lc.bFlowControl = 0;
pch34x->SetLineCoding(&lc);
}
};
USB Usb;
MyAsyncOper AsyncOper;
CH34X Acm(&Usb, &AsyncOper);*/
void setup()
{
Serial.begin(250000);
Usb.Init();
}
void loop()
{
Usb.Task();
// Arduino with 16U2 Interface-Chip
rcvd = 64;
//Arduino with CH340 Interface-Chip
//rcvd = 32;
if( Acm.isReady()) {
if(Serial.available()) {
data= Serial.read();
Acm.SndData(1, &data);
}
Acm.RcvData(&rcvd, buf);
if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
}
}
Re: Der AVR-/ARDUINO-Faden
Ich hab mal eine Frage:
Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"
Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"
Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Re: Der AVR-/ARDUINO-Faden
Ich vermute mal, auf Fußpilzbasis (Assembler) wird es schon gehen, wenn du die Register direkt ansprichst - frag mich aber bloß nicht wie.
Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade
Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade
Re: Der AVR-/ARDUINO-Faden
Ich hab von dem arduino-C keine Plan aber vielleicht bring es Dir was:Sir_Death hat geschrieben:Auf meine Frage (1 weiter oben) gibt es scheinbar noch keine Antwort. Schade
Code: Alles auswählen
// General definitions
#include <SPI.h>
uint16_t rcvd = 0;
byte data = 0;
byte i = 0;
byte buf[64];
// Arduino with 16U2 Interface-Chip
#include <cdcacm.h>
class MyAsyncOper : public CDCAsyncOper {
public: byte OnInit(ACM *pacm) {
LINE_CODING lc;
lc.dwDTERate = 250000;
lc.bCharFormat = 0;
lc.bParityType = 0;
lc.bDataBits = 8;
pacm->SetLineCoding(&lc);
}
};
USB Usb;
MyAsyncOper AsyncOper;
ACM Acm(&Usb, &AsyncOper);
//Arduino with CH340 Interface-Chip
/*#include <cdc_ch34x.h>
class MyAsyncOper : public CDCAsyncOper {
public: byte OnInit(CH34X *pch34x) {
LINE_CODING lc;
lc.dwDTERate = 250000;
lc.bCharFormat = 0;
lc.bParityType = 0;
lc.bDataBits = 8;
lc.bFlowControl = 0;
pch34x->SetLineCoding(&lc);
}
};
USB Usb;
MyAsyncOper AsyncOper;
CH34X Acm(&Usb, &AsyncOper);*/
void setup()
{
Serial.begin(250000);
Usb.Init();
pinMode([Pin mit Schalter], INPUT);//Hier muss ein Pull-up zu Vcc und ein Schalter zu Gnd dran
}
void loop()
{
Usb.Task();
if (LOW==DigitalReade([Pin mit Schalter]))
{
// Arduino with 16U2 Interface-Chip
rcvd = 64;
}
else
{
//Arduino with CH340 Interface-Chip
rcvd = 32;
}
if( Acm.isReady()) {
if(Serial.available()) {
data= Serial.read();
Acm.SndData(1, &data);
}
Acm.RcvData(&rcvd, buf);
if( rcvd ) for(i=0; i < rcvd; i++ ) Serial.print((char)buf[i]);
}
}
Habs nicht geprüft aber da sie mit C verwand ist könnte das hier gehen:gafu hat geschrieben:Ich hab mal eine Frage:
Ich hab eine steuerung mit einem Atmega2560 prozessor.
Der hat ja 1000 beinchen, und eben auch welche, die beim "arduino mega" nicht auf buchsenleisten herausgeführt sind, und deshalb beim pin-mapping auch keine nummer in den üblichen übersichten haben.
z.B. Pin 69 "Port J bit 6"
Wie steuere ich den denn an mit den üblichen mitteln in der arduino ide?
Code: Alles auswählen
DDRJ|=(1<<6);//Vergleichbar mit PinMode();
PORTJ|=(1<<6);//Setzen
PORTJ&=~(1<<6);//Zurück setzen
Re: Der AVR-/ARDUINO-Faden
Servus Anse
Danke - aber das ist leider nicht des Rätsels Lösung - soweit komme ich zum Glück selbst.
Mein Problem ist, dass die beiden USB-Librarys für den CH340 und den 16U2 die selben public Variablen verwenden, und sich das deswegen beim compilieren beißt...
Und eine Library ändern, damit das geht, übersteigt noch bei weitem meine Fähigkeiten.
Ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt.
Inzwischen habe ich (bei 3D-Drucker Firmware abgeschaut) zumindest geschafft, dass ich nicht jedes mal die gesamten Kommentarmarker ändern muss, sondern eine Config-Variable am Anfang, die den Compiler beeinflusst.
EDIT: Und externer Pullup braucht man nicht - einfach INPUT gegen INPUT_PULLUP tauschen
Danke - aber das ist leider nicht des Rätsels Lösung - soweit komme ich zum Glück selbst.
Mein Problem ist, dass die beiden USB-Librarys für den CH340 und den 16U2 die selben public Variablen verwenden, und sich das deswegen beim compilieren beißt...
Und eine Library ändern, damit das geht, übersteigt noch bei weitem meine Fähigkeiten.
Ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt.
Inzwischen habe ich (bei 3D-Drucker Firmware abgeschaut) zumindest geschafft, dass ich nicht jedes mal die gesamten Kommentarmarker ändern muss, sondern eine Config-Variable am Anfang, die den Compiler beeinflusst.
EDIT: Und externer Pullup braucht man nicht - einfach INPUT gegen INPUT_PULLUP tauschen
-
- Beiträge: 1063
- Registriert: Di 22. Aug 2017, 05:19
- Wohnort: Berlin
Re: Der AVR-/ARDUINO-Faden
Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.
Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...
Beim 2560 ist wohl wirklich Datenblattlektüre und eventuell auch inline-Assembler erforderlich.
Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...
Beim 2560 ist wohl wirklich Datenblattlektüre und eventuell auch inline-Assembler erforderlich.
Re: Der AVR-/ARDUINO-Faden
bei den üblichen 3d-drucker-firmwares gibts ne zweite serielle schnittstelle, z.b. für die steuerrung per bluetooth-modul.
Dort kannst du mit einem beliebigen geräts einfach per seriellem Uart Gcode-befehle reinsenden.
Du musst nur verhindern, das die handsteuerung etwas sendet während auf dem usb auch gcode reinkommt, weil das ineinanedrgewürfelt werden könnte (also auch innerhalb einer zeile)
weiss jetzt gerade nicht welchen entwicklungsstand die cnc-option von repetier firmware haben, aber das mal so als idee was man machen könnte.
Dort kannst du mit einem beliebigen geräts einfach per seriellem Uart Gcode-befehle reinsenden.
Du musst nur verhindern, das die handsteuerung etwas sendet während auf dem usb auch gcode reinkommt, weil das ineinanedrgewürfelt werden könnte (also auch innerhalb einer zeile)
weiss jetzt gerade nicht welchen entwicklungsstand die cnc-option von repetier firmware haben, aber das mal so als idee was man machen könnte.
Re: Der AVR-/ARDUINO-Faden
das haut leider nicht hin, da in den Libs einen weiter Lib aufgerufen wird (im Link enthalten), die wieder auf die public-Variablen zugreift - und die kennt sich dann nicht mehr aus. - Nichts anderes, als wenn du im ISO-OSI Modell plötzlich Schicht 3 (oder war es 4?) doppelt hast. Mit wem soll Schicht 2 dann kommunizieren?berlinerbaer hat geschrieben:Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.
Der Schalter war ja auch so irgendwie die Idee, damit der nicht selbst erkennen muss anhand des USB-Slaves, sondern vor dem Treiber laden weis, welchen.berlinerbaer hat geschrieben: Dann per Schalter zwischen beiden hin- und herschalten. Oder, noch simpler, die Buchsen in den zu steuernden Geräten direkt mit der passenden Brücke versehen, dann gehts ganz ohne Nachdenken und Platz genug wäre selbst bei einem DB9-Stecker...
Leider scheitert es schon beim compilieren - komm also gar nicht so weit.
Und die Buchse lässt sich ein bisserl schwer umbauen, nachdem das USB ist...
@gafu: das ist mal ne Idee! Daran hatte ich noch gar nicht gedacht.
Muss ich morgen mal anschauen, was sich da bei Marlin tut. (Heute ist es schon ein wenig spät ) - Gute Nacht
- Fritzler
- Beiträge: 12603
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der AVR-/ARDUINO-Faden
Nich im ernst?Sir_Death hat geschrieben:das haut leider nicht hin, da in den Libs einen weiter Lib aufgerufen wird (im Link enthalten), die wieder auf die public-Variablen zugreift - und die kennt sich dann nicht mehr aus. - Nichts anderes, als wenn du im ISO-OSI Modell plötzlich Schicht 3 (oder war es 4?) doppelt hast. Mit wem soll Schicht 2 dann kommunizieren?berlinerbaer hat geschrieben:Ohne jetzt den code gelesen zu haben, würde ich bei den sich überschneidenden Variablennamen einfach bei einem der beiden Treiber alle mit einem einheitlichen, kurzen Präfix versorgen, damit nix mehr durcheinander kommt.
Ich dachte solch schlechter Programmierstil ist unter den C Programmierern seit den 2000ern ausgetrieben.
Der OSI Vergleich hinkt, die Schichten sind Modular aufgebaut und sollen nicht ineinander greifen, nur Parameter übergeben.
Wie wärs richtig? So hier:
Code: Alles auswählen
static UART_HandleTypeDef s_UARTHandle;
-------------
s_UARTHandle.Instance = USART2;
s_UARTHandle.Init.BaudRate = 115200;
s_UARTHandle.Init.WordLength = UART_WORDLENGTH_8B;
s_UARTHandle.Init.StopBits = UART_STOPBITS_1;
s_UARTHandle.Init.Parity = UART_PARITY_NONE;
s_UARTHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
s_UARTHandle.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&s_UARTHandle) != HAL_OK)
asm("bkpt 255");
for (;;)
{
uint8_t buffer[4];
HAL_UART_Receive(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY);
HAL_UART_Transmit(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY);
}
Oder kurz und knackig selber gebaut:
Code: Alles auswählen
static char usart3_tx_buf[256];
static char usart3_rx_buf[16];
static struct usart_irq usart3_irq;
void init_debugging(void){
//USART3 Init für dprintf
fifo_init(&(usart3_irq.tx_fifo), usart3_tx_buf, sizeof(usart3_tx_buf));
fifo_init(&(usart3_irq.rx_fifo), usart3_rx_buf, sizeof(usart3_rx_buf));
rcc_enable_clock(RCC_USART3);
rcc_enable_clock(RCC_GPIOC);
gpio_initpin(PORTC, 10, AF_PP, GPIO_HS, AF7_USART1_TO_3); //Altfunc TX Pin
usart_init_irq(&usart3_irq, USART3_INDEX, 115200, 16000000);
deprintf_setusart(USART3_INDEX, usart_putc);
}
Re: Der AVR-/ARDUINO-Faden
Okayyyy...
Sorry ich versteh absolut nur Bahnhofsalat.
Ist das jetzt eine lib für den USB am Arduino, oder was ist das? - Sorry die blöde Frage, aber ich verstehe nur, dass das irgendetwas mit senden und empfangen und den jeweiligen Buffern zu tun hat. Dann ist bei mir Schluss mit C...
Jaja ich weiß- lies ein Buch über C - mach ich, wenn der Tag 72 Stunden hat
Sorry ich versteh absolut nur Bahnhofsalat.
Ist das jetzt eine lib für den USB am Arduino, oder was ist das? - Sorry die blöde Frage, aber ich verstehe nur, dass das irgendetwas mit senden und empfangen und den jeweiligen Buffern zu tun hat. Dann ist bei mir Schluss mit C...
Jaja ich weiß- lies ein Buch über C - mach ich, wenn der Tag 72 Stunden hat
- Bauteiltöter
- Beiträge: 254
- Registriert: So 11. Aug 2013, 17:37
Re: Der AVR-/ARDUINO-Faden
Wenn du C programmieren willst ohne C zu lernen, dann musst du vielleicht einsehen, dass du nicht jedes Ziel erreichen kannst. Dann funktionieren beide 'Libraries' nebeneinander halt einfach nicht und du musst alternativen suchen.Sir_Death hat geschrieben:Jaja ich weiß- lies ein Buch über C - mach ich, wenn der Tag 72 Stunden hat
Ein abstraktes Konzept "ich versuche mehr oder weniger ein Plug and Play mit Autodetect zu programmieren, wo der Arduino selbst entscheidet, welchen Treiber er lädt." ist halt nicht mehr Trivial, sowas funktioniert ja sogar bei Computern immer mal wieder nicht vernünftig und man muss manuell Hand anlegen.
- Fritzler
- Beiträge: 12603
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der AVR-/ARDUINO-Faden
Das ist nichts gegen dich, sondern gegen die unfähigen Lib Programmierer
Das wäre total egal welche CPU darunter werkelt, das soll son HAL/Treiber ja abstrahieren.
In dem struct sind Variablen, die definieren wie der UART zu werkeln hat.
Die struct Member Namen und die reingeschriebenen define Werte sprechen ja für sich.
static UART_HandleTypeDef s_UARTHandle; <- struct anlegen
s_UARTHandle.Instance = USART2; <- ansagen welcher UART, hier könnt man auch wegabstrahieren ob UART über USB wie beim 16U4 oder eben "normaler" UART an dem extern nen USB<->UART hängt. (der Treiber/HAL ruft dann eben das passende Submodul auf)
HAL_UART_Init(&s_UARTHandle) <- der eigentliche Init der Hardware
HAL_UART_Receive(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY); <- hier wird beim lesen angegeben von welchem UART gelesen werden soll, das struct könnte schließtlich noch ne Statemachine des Treibers enthalten.
Mein eigener HAL bekommt dann eben gleich noch ne FIFO in Rachen geworfen für den UART IRQ.
fifo_init(&(usart3_irq.tx_fifo), usart3_tx_buf, sizeof(usart3_tx_buf)); <- bekommt den Buffer für die FIFO und speichert das FIFO Objekt im "Instanzobjekt" des HAL/Treiber ab
usart_init_irq(&usart3_irq, USART3_INDEX, 115200, 16000000); <- der Treiber init, hier schreibt nicht der User die Baudrate ins struct, das macht der Treiber selber, der Index wird bei meiner Lib mit angegbene, weil sich der Treiber den Pointer aufs struct merken kann.
deprintf_setusart(USART3_INDEX, usart_putc); <- dem printf sagen, dass er über UART3 ausgeben soll
Beispielhaft sieht der UARt Init dann so aus:
Das wäre total egal welche CPU darunter werkelt, das soll son HAL/Treiber ja abstrahieren.
In dem struct sind Variablen, die definieren wie der UART zu werkeln hat.
Die struct Member Namen und die reingeschriebenen define Werte sprechen ja für sich.
static UART_HandleTypeDef s_UARTHandle; <- struct anlegen
s_UARTHandle.Instance = USART2; <- ansagen welcher UART, hier könnt man auch wegabstrahieren ob UART über USB wie beim 16U4 oder eben "normaler" UART an dem extern nen USB<->UART hängt. (der Treiber/HAL ruft dann eben das passende Submodul auf)
HAL_UART_Init(&s_UARTHandle) <- der eigentliche Init der Hardware
HAL_UART_Receive(&s_UARTHandle, buffer, sizeof(buffer), HAL_MAX_DELAY); <- hier wird beim lesen angegeben von welchem UART gelesen werden soll, das struct könnte schließtlich noch ne Statemachine des Treibers enthalten.
Mein eigener HAL bekommt dann eben gleich noch ne FIFO in Rachen geworfen für den UART IRQ.
fifo_init(&(usart3_irq.tx_fifo), usart3_tx_buf, sizeof(usart3_tx_buf)); <- bekommt den Buffer für die FIFO und speichert das FIFO Objekt im "Instanzobjekt" des HAL/Treiber ab
usart_init_irq(&usart3_irq, USART3_INDEX, 115200, 16000000); <- der Treiber init, hier schreibt nicht der User die Baudrate ins struct, das macht der Treiber selber, der Index wird bei meiner Lib mit angegbene, weil sich der Treiber den Pointer aufs struct merken kann.
deprintf_setusart(USART3_INDEX, usart_putc); <- dem printf sagen, dass er über UART3 ausgeben soll
Beispielhaft sieht der UARt Init dann so aus:
Code: Alles auswählen
#if USART_USE_IRQ
void usart_init_irq(struct usart_irq *idx, unsigned int usart_base, unsigned int baudrate, unsigned int bus_clk){
volatile struct usart * const usart = (struct usart *)usart_bases[usart_base];
irq_idx[usart_base] = idx;
idx->usart_base_addr = usart_bases[usart_base];
usart->CR1 = CR1_UE;
usart->CR2 = 0;
usart->CR3 = 0;
/*
Baudteiler ist bus_clk/(16 * baudrate)
Fraction hat 4 bits -> 16
-> sparen wir uns die 16 und daher diese Formel:
*/
usart->BRR = bus_clk/baudrate;
usart->CR1 |= CR1_RXNEIE | CR1_TE | CR1_RE;
nvic_enable_irq(usart_irq_nbrs[usart_base], 0xE, 0xF);
};
#endif
Re: Der AVR-/ARDUINO-Faden
Ist ein neuer Arduino mit passendem CH340 nicht die simpelste Lösung?
Vielleicht findet sich ja jemand zum Tauschen, bei dem es egal ist, welche Schnittstelle der Arduino hat?
Vielleicht findet sich ja jemand zum Tauschen, bei dem es egal ist, welche Schnittstelle der Arduino hat?
Re: Der AVR-/ARDUINO-Faden
@Bauteiltöter: Hast ja recht - aber darum frag ich ja euch
@Fritzler Aha! Danke für die Erklärung - das Wort "Hardware Abstraktion layer" hab ich schon mal gehört - wird für mich trotzdem ne ordentliche Herausforderung.
@sunset: wollte ich mir sparen, aber ist inzwischrn durchaus mehr als nur einen Gedanken wert. - nachdem ich im ganzen Haus schon um die 20 Arduino Mega verteilt habe, muss ich halt mal suchen gehen, wo ein Tauschkandidat werkelt.
@alle: Danke für eure Geduld - ich glaube, das gewünschte Ziel ist für mich momentan noch unerreichbar.
@Fritzler Aha! Danke für die Erklärung - das Wort "Hardware Abstraktion layer" hab ich schon mal gehört - wird für mich trotzdem ne ordentliche Herausforderung.
@sunset: wollte ich mir sparen, aber ist inzwischrn durchaus mehr als nur einen Gedanken wert. - nachdem ich im ganzen Haus schon um die 20 Arduino Mega verteilt habe, muss ich halt mal suchen gehen, wo ein Tauschkandidat werkelt.
@alle: Danke für eure Geduld - ich glaube, das gewünschte Ziel ist für mich momentan noch unerreichbar.
- Fritzler
- Beiträge: 12603
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der AVR-/ARDUINO-Faden
Das mit dem C Buch ist genau andersrum.
Es ist schneller dies zu lesen, als bei jedem Murks perkussionswartung anzuwenden bis es halbwegs läuft.
Zu empfehlen ist das Original:
https://github.com/germanoa/compiladore ... nighan.pdf
Es ist schneller dies zu lesen, als bei jedem Murks perkussionswartung anzuwenden bis es halbwegs läuft.
Zu empfehlen ist das Original:
https://github.com/germanoa/compiladore ... nighan.pdf
Re: Der AVR-/ARDUINO-Faden
Danke für den Link - ist schon gespeichert.
Mal schauen, wo ich das auf der Projektliste einordne.
Jedenfalls hat sich inzwischen gezeigt, dass der CH340-Treiber horrende langsam ist - da denkt man, das Programm wäre schon abgekackt.
Mit dem 16U2-Treiber geht es soviel schneller, dass keine Einschränkung merkbar ist - werd wohl die anderen beiden Maschinchen auch umrüsten...
Jedenfalls tut die Handsteuerung am Steckbrett schon - jetzt muss noch ein Gehäuse entstehen. Hmmmm..... mach ich das additiv oder subtraktiv? - immer diese schweren Entscheidungen ob Fräsen oder 3D-Drucken
Mal schauen, wo ich das auf der Projektliste einordne.
Jedenfalls hat sich inzwischen gezeigt, dass der CH340-Treiber horrende langsam ist - da denkt man, das Programm wäre schon abgekackt.
Mit dem 16U2-Treiber geht es soviel schneller, dass keine Einschränkung merkbar ist - werd wohl die anderen beiden Maschinchen auch umrüsten...
Jedenfalls tut die Handsteuerung am Steckbrett schon - jetzt muss noch ein Gehäuse entstehen. Hmmmm..... mach ich das additiv oder subtraktiv? - immer diese schweren Entscheidungen ob Fräsen oder 3D-Drucken
Re: Der AVR-/ARDUINO-Faden
Hallo liebe Leute
Ich befasse mich grad mit dem Arduino Nano. (Danke Zabex)
Habe die letzten Tage schon viel gelesen,einiges an Hardware zum Spielen da
und auch noch einiges geordert,was hoffentlich in den nächsten Tagen kommt.
Ich habe auch schon ein konkretes Projekt im Kopf.
Es könnte auch ein UNO werden...
Die "einzelnen" Sketches" gibt es zum Großteil im Netz.
Die werde ich dann ausprobieren,wenn die restliche Hardware da ist.
Ich habe nur Sorgen,daß ich die nicht alle zusammengehäkelt kriege (für mein Projekt)
Gibt es jemanden auf dem Treffen 2018,der mir gegen Fleisch und Getränk helfen würde ?
Ich befasse mich grad mit dem Arduino Nano. (Danke Zabex)
Habe die letzten Tage schon viel gelesen,einiges an Hardware zum Spielen da
und auch noch einiges geordert,was hoffentlich in den nächsten Tagen kommt.
Ich habe auch schon ein konkretes Projekt im Kopf.
Es könnte auch ein UNO werden...
Die "einzelnen" Sketches" gibt es zum Großteil im Netz.
Die werde ich dann ausprobieren,wenn die restliche Hardware da ist.
Ich habe nur Sorgen,daß ich die nicht alle zusammengehäkelt kriege (für mein Projekt)
Gibt es jemanden auf dem Treffen 2018,der mir gegen Fleisch und Getränk helfen würde ?
Re: Der AVR-/ARDUINO-Faden
Ich habe seit langen mal wieder mal AVR Studio installiert, da ich eine Aufgabe für einen Tiny 45 habe.
Der kleine soll alle halbe Stunde einen Portpin auf kurz auf Low ziehen.
Im Prinzip also ein langsamer LED Blinker, dass habe ich auch schon hinbekommen und läuft
Nun verbaucht der Tiny etwa 1,3mA Strom. Ich habe ihn schon auf 1Mhz getaktet.
Das ist aber immernoch zuviel!
Welcher Schlafmodus macht hier Sinn?
Und wie baut man das am Sinnvollsten ein?
Der Tiny macht ansonsten nichts.
Da sind einfach nur 2 Delay Funktionen drin.
Der kleine soll alle halbe Stunde einen Portpin auf kurz auf Low ziehen.
Im Prinzip also ein langsamer LED Blinker, dass habe ich auch schon hinbekommen und läuft
Nun verbaucht der Tiny etwa 1,3mA Strom. Ich habe ihn schon auf 1Mhz getaktet.
Das ist aber immernoch zuviel!
Welcher Schlafmodus macht hier Sinn?
Und wie baut man das am Sinnvollsten ein?
Der Tiny macht ansonsten nichts.
Da sind einfach nur 2 Delay Funktionen drin.
Re: Der AVR-/ARDUINO-Faden
probiert mal mit 32khz Quarz und entsprechende flags (Fuses)
dann sollte der wenigere Strom verbrauchen.
Noch wenigere Stromverbrauch kann man erzielen, wenn man ihm zum schlafen bringt und Timer & Überlauf-Interrupt aktiviert.
Bei Überlauf (= Interrupt) wacht AVR auf und zählt einmal hoch, und prüfen, ob der LED anlachen sollen und dann wieder sich zum Schlafen legen.
Allerdings erfordert das völlige andere Konzept als "delay_ms"-Funktion. Doch, da macht TINY was, denn der zählt sich runter (so funktioniert "delay_ms")
Noch habe ich damit nicht befasst und da bin ich sicher, dass es möglich ist.
dann sollte der wenigere Strom verbrauchen.
Noch wenigere Stromverbrauch kann man erzielen, wenn man ihm zum schlafen bringt und Timer & Überlauf-Interrupt aktiviert.
Bei Überlauf (= Interrupt) wacht AVR auf und zählt einmal hoch, und prüfen, ob der LED anlachen sollen und dann wieder sich zum Schlafen legen.
Allerdings erfordert das völlige andere Konzept als "delay_ms"-Funktion. Doch, da macht TINY was, denn der zählt sich runter (so funktioniert "delay_ms")
Noch habe ich damit nicht befasst und da bin ich sicher, dass es möglich ist.
- Fritzler
- Beiträge: 12603
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der AVR-/ARDUINO-Faden
Delay Funktion heißt Vollgas aufm Kern.
Zudem kann der T45 auch mit dem internen Watchdogtakt laufen -> 128kHz.
Ansonsten nimmste den 8Bit Timer1 (der kann bis 16k vorteilen).
Den Konfigurierste so, das er alle xmin nen IRQ wirft.
Mit einem IRQ kann man den AVR Kern aufwachen, den packste nämlich ind en Idle Mode.
https://www.nongnu.org/avr-libc/user-ma ... sleep.html
Ich würd ja noch mehr schreiben, aber ich hör meine Straßenbahn kommen
Zudem kann der T45 auch mit dem internen Watchdogtakt laufen -> 128kHz.
Ansonsten nimmste den 8Bit Timer1 (der kann bis 16k vorteilen).
Den Konfigurierste so, das er alle xmin nen IRQ wirft.
Mit einem IRQ kann man den AVR Kern aufwachen, den packste nämlich ind en Idle Mode.
https://www.nongnu.org/avr-libc/user-ma ... sleep.html
Ich würd ja noch mehr schreiben, aber ich hör meine Straßenbahn kommen
Re: Der AVR-/ARDUINO-Faden
Interner Watchdog und alle x Sekunden aufwachen lassen. Dazwischen in den Powerdown. Wenn man noch sparsamer unterwegs sein will kann man sich noch das Kapitel 7.3 im DB anschauen.
Auf die Weise läuft bei mir schon ein Tiny13 über 5 Jahre auf einer CR2032. Musste sie nur tauschen weil man den Piepser nicht mehr richtig gehört hat.
Auf die Weise läuft bei mir schon ein Tiny13 über 5 Jahre auf einer CR2032. Musste sie nur tauschen weil man den Piepser nicht mehr richtig gehört hat.
-
- Beiträge: 271
- Registriert: Di 13. Aug 2013, 16:19
Re: Der AVR-/ARDUINO-Faden
Hallo Leute
Nach langer langer Zeit habe ich wieder angefangen AVR sprich diesmal Arduino UNO zu programmieren. Früher mit WinAVR ohne Arduino aber da bin ich zu lange weg und deswegen programmieren ich den Arduino UNO mit Arduino Sketch. Es hat viele angenehme Funktionen wie das Arbeiten mit Strings was ich mit richtigem C richtig schrecklich finde. Was mich aber am meisten nervt ist, dass nicht alle Timer zur verfügung stehen. Der Timer0 ist für delay usw reserviert und diese Funktion brauche ich nicht.
Kann man den Timer 0 mit einem Trick in Arduino Sketch doch nutze?
Ich habe versucht mit:
ISR(TIMERO_OVF_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}
bekomme ich die Fehlermeldung:
wiring.c.o (symbol from plugin): In function `__vector_16':
(.text+0x0): multiple definition of `__vector_16'
sketch\MyDyno_2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Uno.
Mit :
ISR(TIMERO_OVF0_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}
bekomme ich keine Fehlermeldung aber der Timer läuft nicht weil es wohl der falsche Vektor ist.
Was ist der Unterschied zwischen "TIMERO_OVF_vect" und "TIMERO_OVF0_vect" ?
Wer kann mir da helfen?
Und mit welcher IDE für Arduino abgesehen mit Sketch arbeitet Ihr?
Gruss
Nach langer langer Zeit habe ich wieder angefangen AVR sprich diesmal Arduino UNO zu programmieren. Früher mit WinAVR ohne Arduino aber da bin ich zu lange weg und deswegen programmieren ich den Arduino UNO mit Arduino Sketch. Es hat viele angenehme Funktionen wie das Arbeiten mit Strings was ich mit richtigem C richtig schrecklich finde. Was mich aber am meisten nervt ist, dass nicht alle Timer zur verfügung stehen. Der Timer0 ist für delay usw reserviert und diese Funktion brauche ich nicht.
Kann man den Timer 0 mit einem Trick in Arduino Sketch doch nutze?
Ich habe versucht mit:
ISR(TIMERO_OVF_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}
bekomme ich die Fehlermeldung:
wiring.c.o (symbol from plugin): In function `__vector_16':
(.text+0x0): multiple definition of `__vector_16'
sketch\MyDyno_2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Uno.
Mit :
ISR(TIMERO_OVF0_vect)
{
digitalWrite(ledPin_13, digitalRead(ledPin_13) ^ 1);
}
bekomme ich keine Fehlermeldung aber der Timer läuft nicht weil es wohl der falsche Vektor ist.
Was ist der Unterschied zwischen "TIMERO_OVF_vect" und "TIMERO_OVF0_vect" ?
Wer kann mir da helfen?
Und mit welcher IDE für Arduino abgesehen mit Sketch arbeitet Ihr?
Gruss
Re: Der AVR-/ARDUINO-Faden
Ich kriege ums Verrecken nicht den Arduino-Treiber für den USB-Serial
installiert !
Auf 2 verschiedenen Rechnern mit W7 Premium...
Die Installationsdatei von https://www.arduino.cc/en/Main/Software
läuft problemlos durch.Fragt auch brav,ob es die FTDI-Treiber und USB-Serial
installieren darf...
Wenn ich dann das Board anstecke "Treiber nicht gefunden/installiert".
Im Gerätemanager wird der USB-Serial ohne Treiber angezeigt.
Treiber aktuallisieren und den Ordner "Driver" von Arduino angeklickt :
Treiber konnte nicht gefunden werden...
installiert !
Auf 2 verschiedenen Rechnern mit W7 Premium...
Die Installationsdatei von https://www.arduino.cc/en/Main/Software
läuft problemlos durch.Fragt auch brav,ob es die FTDI-Treiber und USB-Serial
installieren darf...
Wenn ich dann das Board anstecke "Treiber nicht gefunden/installiert".
Im Gerätemanager wird der USB-Serial ohne Treiber angezeigt.
Treiber aktuallisieren und den Ordner "Driver" von Arduino angeklickt :
Treiber konnte nicht gefunden werden...
Re: Der AVR-/ARDUINO-Faden
Moin Rial,
ist denn auf dem Arduino ein FTDI drauf? Auf meinen Chinaclones sind CH340 drauf.
LG
Arne
ist denn auf dem Arduino ein FTDI drauf? Auf meinen Chinaclones sind CH340 drauf.
LG
Arne
Re: Der AVR-/ARDUINO-Faden
Ich habe 2 Nano-Clones und einen Uno-Clone ausprobiert.
Auf die beiden Nanos habe ich vor ein paar Wochen
auch schon das Beispiel "Blink" geschoben,welches auch funktioniert hat.
Aber auf einmal wollte es nicht mehr,bzw der Treiber war weg und lässt
sich nicht mehr installieren.
Auf die beiden Nanos habe ich vor ein paar Wochen
auch schon das Beispiel "Blink" geschoben,welches auch funktioniert hat.
Aber auf einmal wollte es nicht mehr,bzw der Treiber war weg und lässt
sich nicht mehr installieren.
- Bastelbruder
- Beiträge: 11563
- Registriert: Mi 14. Aug 2013, 18:28
Re: Der AVR-/ARDUINO-Faden
Vielleicht hilfts ...
Der Treiber - nicht bloß der Ordner - muß explizit ausgewählt werden und nur dann kommt auch die bekannte Sicherheitsabfrage. Dann wird der Treiber tatsächlich "aktualisiert". Ansonsten tut Windoofs bloß so als würde es updaten und wenn man nachschaut ist genau nix passiert.
Hält halt vielleicht bloß bis zur nächsten Gängelung.
Wird Zeit daß hier der hualp!-emoticon eingeführt wird.
Der Treiber - nicht bloß der Ordner - muß explizit ausgewählt werden und nur dann kommt auch die bekannte Sicherheitsabfrage. Dann wird der Treiber tatsächlich "aktualisiert". Ansonsten tut Windoofs bloß so als würde es updaten und wenn man nachschaut ist genau nix passiert.
Hält halt vielleicht bloß bis zur nächsten Gängelung.
Wird Zeit daß hier der hualp!-emoticon eingeführt wird.
Re: Der AVR-/ARDUINO-Faden
Eine direkte Datei kann ich nicht auswählen.Nur den Ordner.
Siehe Bild
Ich habe auch keine Ahnung,was ich vor ein paar Wochen anders
gemacht habe !?!
Siehe Bild
Ich habe auch keine Ahnung,was ich vor ein paar Wochen anders
gemacht habe !?!
Re: Der AVR-/ARDUINO-Faden
Hat vielleicht jemad einen (deutschen) Link zu funktionierenden Nanos ?
Darf auch ein Uno sein...
Ama Zon oder Bucht ?
Ich bin gerne bereit,mehr als 2 Euro pro Board zu bezahlen
Aber auch nur,wenn es auf Anhieb mit der offiziellen Software funktioniert !!!
Darf auch ein Uno sein...
Ama Zon oder Bucht ?
Ich bin gerne bereit,mehr als 2 Euro pro Board zu bezahlen
Aber auch nur,wenn es auf Anhieb mit der offiziellen Software funktioniert !!!
- Weisskeinen
- Beiträge: 3950
- Registriert: Di 27. Aug 2013, 16:19
Re: Der AVR-/ARDUINO-Faden
Einerseits könnte es helfen, mal nach der Vendor-ID und der Device-ID des USB-Serial-Wandlers zu suchen, um sicherzustellen, dass das wirklich ein FTDI-Teil ist. Wenn nicht (z.B. der CH340), passenden Treiber suchen und installieren. Wenn es ein FTDI-Chip sein soll, dann könnte es noch ein gefälschter sein. Neue FTDI-Treiber sollen das erkennen können und verweigern dann die Zusammenarbeit. Wie man das konkret löst, weiß ich aber jetzt auch nicht.
Einen Treiber kann man auch installieren, indem man die .inf-Datei im Explorer auswählt und installieren lässt (ööööhhhhmmmmm, Doppelklick oder Kontextmenü, weiß ich jetzt gerade nicht).
Einen Treiber kann man auch installieren, indem man die .inf-Datei im Explorer auswählt und installieren lässt (ööööhhhhmmmmm, Doppelklick oder Kontextmenü, weiß ich jetzt gerade nicht).
Re: Der AVR-/ARDUINO-Faden
Geilo ! Das war das Problem ! Ich danke dir vielmals !!!Einerseits könnte es helfen, mal nach der Vendor-ID und der Device-ID des USB-Serial-Wandlers zu suchen, um sicherzustellen,
dass das wirklich ein FTDI-Teil ist. Wenn nicht (z.B. der CH340), passenden Treiber suchen und installieren.
- Weisskeinen
- Beiträge: 3950
- Registriert: Di 27. Aug 2013, 16:19
Re: Der AVR-/ARDUINO-Faden
Jetzt habe ich auch mal ein Problem mit einem Arduino Pro Mini. Ich habe ein Thermometer gebaut, das einen DS18S20 ausliest (mit der OneWire- und der DallasTemperature-Library) und den Messwert auf einem OLED-Display ausgibt (mit der Adafruit_GFX- und der Adafruit_SSD1306-Library). Außerdem wird je nach Temperatur auch noch ein Servo angesteuert (Standard-Arduino-Servo-Library). Das funktioniert auch im Wesentlichen ordentlich, außer, dass immer wieder und nach völlig unterschiedlichen Zeiträumen die loop-Funktion stoppt. Irgendwas stürzt da irgendwie ab und ich weiß nicht, wie ich dem auf die Schliche kommen soll. Hat da jemand eine Idee?
An der Stromversorgung sollte es eigentlich nicht liegen, es sei denn, der Servo stört doch mal sporadisch zu stark...
An der Stromversorgung sollte es eigentlich nicht liegen, es sei denn, der Servo stört doch mal sporadisch zu stark...
Re: Der AVR-/ARDUINO-Faden
In welchen Zeitabständen stürzt das ab? - Hatte mal das selbe Problem mit einer windschiefen LCD-Library, in der Timer über das mitzählen von millisekunden gelöst waren - leider läuft auch irgendwann ein long int über...