Hallo zusammen.
Ich bin derzeit wieder dabei etwas ehr Zeit für die "Bastelei" zu
investieren. Aktuell möchte ich einen Fillament-Extruder bauen (Die
Mechanische Seite ist so gut wie fertig.
Als Temperatusensor für die Nozzle habe ich mir einen PT100 in
Kombination mit einem MAX 31865 geschnappt.
Nach dem ich erst einmal eine Möglichkeit gebaut habe über Timer die
Motoren durchlaufen zu lassen mit vorgegebener RPM um die CPU nicht zu
blocken, teste ich nun die Möglichkeiten mit dem MAX aus.
Das Problem ist folgendes. Ich habe hier einen Arduino Mega liegen
welchen ich gerne verwenden möchte. Dar die Arduino IDE allerdings die
Timer und sämtliche Resourcen nach belieben selbst konfiguriert, mlchte
ich das ganze in C umsetzen mit AVR Studio. Meine C Kenntnisse sind
fasst als katastrophal zu bezeichnen, worum es hier aber nicht gehen
soll.
Nun habe ich folgendes Problem. Der Serielle Port (USB vom Arduino
Board) spuckt mir leider nur "Müll" aus.
Und ich stecke in einer gewissen Sackgasse was den MAX angeht.
anscheinend bleibt der AVR in irgendeiner schleife hängen, was mangels
RS232 schnittstelle aktuell schwer zu diagnostizieren ist..
Ich wäre ber Hilfe in jeglicher hinsicht mehr als Dankbar.
Daniel B. schrieb:> SPCR = (1<<SPE)|(1<<MSTR)>(1<<SPR0);
Die Zeile macht sicher Probleme, das "größer als" sollte wohl eine Pipe
sein.
Mit Wurst im SPCR wird auch Wurst im SPDR landen.
1
intmessure_resistance(void){
2
//Temperature (NC) ? (ADC code/32) – 256
3
SPI_trans_8(0x01);
4
uint8_tMSB=SPI_trans_8(0);
5
SPI_trans_8(0x02);
6
uint8_tLSB=SPI_trans_8(0);
7
....
Ich kenne das IC nicht, aber hier wird das Ergebnis der ersten SPI
Transaktion nicht gesichert. Bist Du sicher, dass das 2. SPI_trans_8 den
Wert liefert, den Du möchtest?
Compiliert das Programm ohne Meldungen? main() sieht die anderen
Funktionen ja nicht, da die Prototypen nicht vorhanden sind.
Bärenmarke schrieb:> Daniel B. schrieb:>> SPCR = (1<<SPE)|(1<<MSTR)>(1<<SPR0);>> Die Zeile macht sicher Probleme, das "größer als" sollte wohl eine Pipe> sein.> Mit Wurst im SPCR wird auch Wurst im SPDR landen.>>
1
>intmessure_resistance(void){
2
>//Temperature (NC) ? (ADC code/32) – 256
3
>SPI_trans_8(0x01);
4
>uint8_tMSB=SPI_trans_8(0);
5
>SPI_trans_8(0x02);
6
>uint8_tLSB=SPI_trans_8(0);
7
>....
8
>
>> Ich kenne das IC nicht, aber hier wird das Ergebnis der ersten SPI> Transaktion nicht gesichert. Bist Du sicher, dass das 2. SPI_trans_8 den> Wert liefert, den Du möchtest?>> Compiliert das Programm ohne Meldungen? main() sieht die anderen> Funktionen ja nicht, da die Prototypen nicht vorhanden sind.
Ich komm leider ursprünglich aus der Assembler Fraktion, was man mir
wohl an der Sauberkeit und Ordnung hier auch anmerkt. C wurde gewählt da
es schlussendlich doch etwas mehr 16bit Berechnungen werden und C hier
einfach komfortabler ist.
Es sollte in messure_resistance folgendermaßen ablaufen:
Sende 0x01 (empfangen wird nichts dar es eine Registeradresse ist)
Sende ein DummyByte um das Höherwertige Byte zu empfangen
Sende 0x02 (Adresse LSB)
Sende ein DummyByte um das Niederwertige Byte zu Empfangen
Daniel B. schrieb:> C wurde gewählt da> es schlussendlich doch etwas mehr 16bit Berechnungen werden und C hier> einfach komfortabler ist.
Absolut. Dann lies Dir vielleicht nochmal was zur Arithmetik in C durch.
1
resistance=RTD_value*referenz*10;
Hier z.B.: Schon der konstante Teil (referenz*10=43000) "füllt" die
16-bit
Variable. Bei der Multiplikation mit 2 bist Du über den Wertebereich
raus. Nimm hier einen 32-bit Typen!
>> unsigned char ist 8-Bit, die oberen 8 Bit aus RTD gehen hier verloren.
Das Entstand wohl dadurch das ich ursprünglich direkt die Temperatur
berechnen und Ausgeben wollte und mich dann doch vorerst mit weniger
zufrieden geben wollte um erst einmal eien Wert der sich in Abhängigkeit
der Temperatur ändert beobachten zu können.
Wie könnte man dies vorerst quick&dirty korrigieren?
Der USART soll derweil als Diagnosemöglichkeit herhalten und später die
Steuerung des ganzen Per LCD und Drehencoder geschehen.
Ich erhalte leider vom USART immer nur ein "?" als Zeichen aus obigen
Zeile
int main(void)
{setup_SPI_MAX31865();
USART_Init(UBRR_VAL);
USART_Transmit("H");
Anscheinend ist bei der USART Konfiguration schon etwas im Busch.
Daniel B. schrieb:> USART_Transmit("H");
Lustig !
Siehst Du diesen Prototype?
>>void USART_Transmit(unsigned char data);
Gibt es denn keine Fehlermeldung(en)?
Karl M. schrieb:> Daniel B. schrieb:>> USART_Transmit("H");>> Lustig !>> Siehst Du diesen Prototype?>>>void USART_Transmit(unsigned char data);>> Gibt es denn keine Fehlermeldung(en)?AVR Studio gibt 0 Errors 0 Warnings 0 Messages beim Compilieren aus.
Daniel B. schrieb:>> Gibt es denn keine Fehlermeldung(en)?>> AVR Studio gibt 0 Errors 0 Warnings 0 Messages beim Compilieren aus.
Dann compiliere das mal mit -Wall -Wextra!
Daniel B. schrieb:> AVR Studio gibt 0 Errors 0 Warnings 0 Messages beim Compilieren aus.
Dann wuerde ich mal ganz schnell danach suchen oder gcc aktualisieren:
e.g.
1
a.c:4:20: warning: large integer implicitly truncated to unsigned type [-Woverflow]
>> sieht auch irgendwie "unbeabsichtigt" aus. Du machst zweimal das selbe?
Besten Dank, das hatte ich übersehen. Natürlich nur einmal nach rechts
schieben. Die Frage ist wo er hängen bleibt. Hab AVR Studio nochmal
compilieren lassen. Habe 9 Wernings und etliche Meldungen. Meine
C-Kenntinisse lassen in der Richtung doch dann zu wünschen übrig.
Was meint ihr betreff dieses Prototypens?
Guten morgen zusammen. Ich hab das ganze noch einmal von null auf
gerollt.
Die Berechnung mit Ablauf stimmen soweit im Simulator. Die Kommunikation
mit dem MAX31 ADC ist noch nicht geprüft. Auch die Serielle
Schnittstelle ist noch nicht implementiert.
Hier einmal der COde
1
#include<avr/io.h>
2
#include<math.h>
3
#define RTD_A 3.9083e-3
4
#define RTD_B -5.775e-7
5
uint16_trefResistor=430;
6
7
//Rechnung passt. Die Kommunikation mit dem Sensor muss noch geprüft werden. hier könnte der kurze HighPulse von SS ein Problem werden
Daniel B. schrieb:> C wurde gewählt da> es schlussendlich doch etwas mehr 16bit Berechnungen werden und C hier> einfach komfortabler ist.
Ich würde sogar die ganzen Meßwertumrechnungen in float machen, dann
hast Du keine Überlaufprobleme mehr. Und die Übertragung zum PC dann als
Text mit sprintf().
Daniel B. schrieb:> int calculate_resistance(uint16_t Rt){> Rt /=32768;
Nach dieser Rechnung wird Rt entweder 0 oder 1 sein. Andere Werte gibt
es hier nicht mehr.
> Rt*= refResistor;
Ergo wird Rt hiernach entweder 0 oder 430 sein.
> return(Rt, 8);
Ein Kommaoperator an einer ganz interessanten Stelle.
Ich würde da den Wert 8 als Rückgabewert erwarten. Was erwartest du?
Der Compiler meint zu dieser Zeile:
"warning: left-hand operand of comma expression has no effect"
Sieh auch:
https://en.wikipedia.org/wiki/Comma_operator
So hier nun einmal ein Code der Zumindest durchläuft. Es sind einige
Serielle Ausgaben eingebaut um den Ablauf etwas nachvollziehen zu
könenn.
Der Prinzipielle Abllauf scheint nun zu funktionieren. Auch aus der SPI
Schleife springt er heraus. Leider spuckt der MAX keinerlei Messwerte
aus. Ich erhalte nur 000 als LSB und 000 als MSB...
Es ist alles etwas quick and dirty.
Ich möchte euch gerne immer am laufenden halten. Leider bekomme ich hier
4 Fehlermeldungen beim Compilieren. Die Arduino IDE flashed es
allerdings ohne nachzudenken.
Severity Code Description Project File Line
Error conflicting types for 'write_MAX_reg' MAX31Soft_SPI
C:\Users\dbern\Documents\Atmel
Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 71
Diese Meldung bekomme ich für jede Funktion... leider bekomme ich den
Fehler nicht behoben und stehe etwas auf dem schlauch.
Messwerte bekomme ich vom MAX31 ebenfalls noch keine. nur 0 als MSB 0
als LSB und folglich 0 als Temperatur.
ich wäre sehr froh wenn ihr mir dabei helfen könntet. Dann steht
demnächst die Hochzeit mit dem Teil der stepperansteuerung an.
Gruß Daniel
Daniel B. schrieb:> Messwerte bekomme ich vom MAX31 ebenfalls noch keine.
Nimm einen Logikanalyzer oder ein Speicheroszi und miss die
Kommunikation. Dann kannst du wenigstens sehen, was du am MOSI sendest
und kontrollieren, ob das zu dem passt, was der MAX laut Datenblatt
erwartet. Und du kannst sehen, ob der am MISO überhaupt irgendwie auf
dein Kommando reagiert. Ohne LA/Oszi kann man solche seriellen
Schnittstellen meist nur unglaublich holprig per Try&Error in Betrieb
nehmen.
Daniel B. schrieb:> Ich möchte euch gerne immer am laufenden halten. Leider bekomme ich hier> 4 Fehlermeldungen beim Compilieren. Die Arduino IDE flashed es> allerdings ohne nachzudenken.>> Severity Code Description Project File Line> Error conflicting types for 'write_MAX_reg' MAX31Soft_SPI> C:\Users\dbern\Documents\Atmel> Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 71
Da stimmen die Datentypen zwischen Funktionsdeklaration und Aufruf nicht
überein.
1.) Lange Texte gehören in den Anhang, siehe Netiquette.
> Messwerte bekomme ich vom MAX31 ebenfalls noch keine. nur 0 als MSB 0> als LSB und folglich 0 als Temperatur.> ich wäre sehr froh wenn ihr mir dabei helfen könntet.
Du musst erstmal einen GAAANZ einfachen SPI-Zugriff machen und testen.
Also ein möglichst einfaches Register lesen und schreiben, z.B. High
Fault Threshold MSB. Wenn das funktioniert geht es weiter, siehe
Fehlersuche.
Ein Oszi oder Logicanalyzer ist hier SEHR hilfreich.
"Nun habe ich folgendes Problem. Der Serielle Port (USB vom Arduino
Board) spuckt mir leider nur "Müll" aus.
Und ich stecke in einer gewissen Sackgasse was den MAX angeht.
anscheinend bleibt der AVR in irgendeiner schleife hängen, was mangels
RS232 schnittstelle aktuell schwer zu diagnostizieren ist.."
So geht das nicht! Zuerst muss dein UART laufen, damit du ein Chance
hast, den Fehler zu finden!
Falk B. schrieb:> Daniel B. schrieb:> Ich möchte euch gerne immer am laufenden halten. Leider bekomme ich hier> 4 Fehlermeldungen beim Compilieren. Die Arduino IDE flashed es> allerdings ohne nachzudenken.> Severity Code Description Project File Line> Error conflicting types for 'write_MAX_reg' MAX31Soft_SPI> C:\Users\dbern\Documents\Atmel> Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 71>> Da stimmen die Datentypen zwischen Funktionsdeklaration und Aufruf nicht> überein.>> 1.) Lange Texte gehören in den Anhang, siehe Netiquette.>> Messwerte bekomme ich vom MAX31 ebenfalls noch keine. nur 0 als MSB 0> als LSB und folglich 0 als Temperatur.>> ich wäre sehr froh wenn ihr mir dabei helfen könntet.>> Du musst erstmal einen GAAANZ einfachen SPI-Zugriff machen und testen.> Also ein möglichst einfaches Register lesen und schreiben, z.B. High> Fault Threshold MSB. Wenn das funktioniert geht es weiter, siehe> Fehlersuche.>> Ein Oszi oder Logicanalyzer ist hier SEHR hilfreich.>> "Nun habe ich folgendes Problem. Der Serielle Port (USB vom Arduino> Board) spuckt mir leider nur "Müll" aus.>> Und ich stecke in einer gewissen Sackgasse was den MAX angeht.> anscheinend bleibt der AVR in irgendeiner schleife hängen, was mangels> RS232 schnittstelle aktuell schwer zu diagnostizieren ist..">> So geht das nicht! Zuerst muss dein UART laufen, damit du ein Chance> hast, den Fehler zu finden!
Also in Aktueller Version läuft der USART. Das Problem waren " " statt '
'.
weitere Tests folgen heute Nacht. Die Schleifen durchläuft er jetzt
ebenfalls vernünftig. Nur das Problem einer toten Kommunikation bleibt
bestehen.
Eine weitere kleine Fehlerquelle ist aktuell denke ich auch der weg wie
ich den AVR flash. Ich schreibe in Atmel Studio 7 und flashe und
recompiliere dabei den Code mit der Arduino IDE, um den Bottloader und
die serielle Schnittstelle weiterhin nutzen zu können.
Gruß Daniel
PS: Ich werde absofort den Quellcode als .c Anhängen.
Bernd N schrieb:> Hast du dir den verlinkten Artikel angesehen ?
In dem Artikel geht es um die Problematik das CS nach jedem Byte High
Level annimmt. Ich habe allerdings schon einen seperaten CS eingebaut
welcher bei mir an Portb4 angeschlossen ist. An den LA hab ich das ganze
noch nicht anschließen können zwecks Zeitmangel.
Gruß Daniel
Guten Abend zusammen. Nun mit aktuellem oberen Code erhalte ich nach
Identifizierung eines Verdrahtungsfehlers durchgehend 0xFF als Wert
zurück gegeben. Die Arduino IDE compiliert ihn Probemlos, AVR STUDIo hat
allerdings ein Problem mit :
Severity Code Description Project File Line
Error conflicting types for 'write_MAX_reg' MAX31Soft_SPI
C:\Users\dbern\Documents\Atmel
Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 70
Error conflicting types for 'read_MAX_reg' MAX31Soft_SPI
C:\Users\dbern\Documents\Atmel
Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 77
Error conflicting types for 'uart_putc' MAX31Soft_SPI
C:\Users\dbern\Documents\Atmel
Studio\7.0\MAX31Soft_SPI\MAX31Soft_SPI\main.c 126
Ich komm hier allerdings nicht auf die Lösung. ich übergebe eine uint8_t
an die Funktion welche einen uint8_t erwartet und erhalte einen
Fehler???
Gruß Daniel