Forum: Mikrocontroller und Digitale Elektronik ATtiny88 funktioniert nur mit Analyzer. Warum?


von Flo (Gast)


Lesenswert?

Hallo Zusammen,

nachdem ich jetz schon einige Tage rumsuche und rumprobiere, komme ich 
an einem eigenen Thread nicht vorbei. Ich habe folgendes Problem:

Ich habe mit einem ATtiny88 einen Berührungssensor aufgebaut. Als 
Rückmeldung leuchten einige LEDs wenn ein bestimmter Schwellwert 
erreicht wird. Das funktioniert alles wunderbar, jedoch nur wenn ich im 
QTAnalyzer auf Start Reading gedrückt habe. Beende ich den Lesevorgang 
bleibt der µC in seiner aktuellen Position stehen. (Wenn beim Beenden 
die LEDs geleuchtet haben, bleiben sie auch an). Ich habe zur Kontrolle 
eine LED auf dauerlicht geschaltet. Diese Leuchtet immer. Irgendwas muss 
er also doch machen.

Ich habe irgendwie den Verdacht dass die Interne Clock nicht Arbeitet. 
Die SUT_CKSEL ist aber auf die interne (default) Clock eingestellt. Am 
~Reset PIN liegt über einem 1k Widerstand VCC (3,3V). Zum Flashen per 
SPI benutze ich das Controlboard vom QT600.
Ich Programmiere mit Atmel Studio 6 mit der QTouch extension.
Bitte um Hilfe, bin bei µC Programmierung noch sehr neu.

Habe auch versucht über ein Labornetzgerät nur die Spannungsversorgung 
auf das Board zu bringen. Der µC Startet aber auch hier nicht. (Aber 
Kontroll LED Leuchtet)



Vielen Dank schonmal für eure Hilfe

Gruß Flo

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:

> Ich habe irgendwie den Verdacht dass die Interne Clock nicht Arbeitet.

Vergiss diese Vermutungen gleich wieder.
Die internas des µC sind etwas, dass zwar nicht über jeden Verdacht 
erhaben ist, welche man allerdings als allerletztes verdächtigt. Gleich 
nach einem Fehler des Compilers.

Sehr viel wahrscheinlicher, und zwar mit Prozentzahlen größer als 99%, 
ist es hingegen, dass das Problem von dir durch entweder die 
Aussenbeschaltung und/oder das Programm verursacht wurde.

> Vielen Dank schonmal für eure Hilfe

Schaltpläne + Programm.
Sonst kann dir hier keiner weiter helfen.

von Flo (Gast)


Angehängte Dateien:

Lesenswert?

Das Grundgerüst des Programms wurde vom QTouch Assistenten erstellt, von 
mir ist lediglich die LED Ansteuerung. Ich kann auch das Projekt 
hochladen wenn das Sinnvoll ist.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define __delay_cycles(n)     __builtin_avr_delay_cycles(n)
4
#define __enable_interrupt()  sei()
5
6
#include "touch_api.h"
7
#include "touch.h"
8
#include "QDebug.h"
9
/*----------------------------------------------------------------------------
10
                                    macros
11
----------------------------------------------------------------------------*/
12
13
#define GET_SENSOR_STATE(SENSOR_NUMBER) qt_measure_data.qt_touch_status.sensor_states[(SENSOR_NUMBER/8)] & (1 << (SENSOR_NUMBER % 8))
14
#define GET_ROTOR_SLIDER_POSITION(ROTOR_SLIDER_NUMBER) qt_measure_data.qt_touch_status.rotor_slider_values[ROTOR_SLIDER_NUMBER]
15
16
/*----------------------------------------------------------------------------
17
                                   LED Controll
18
----------------------------------------------------------------------------*/
19
20
void LED_ON (void) {
21
  
22
  DDRB = 0xFF;
23
  DDRD = 0xFF;
24
  
25
  PORTB &= ~((1<<6) | (1<<7));
26
  PORTD &= ~((1<<5) | (1<<6) | (1<<7));
27
28
29
}
30
31
32
void LED_OFF (void){
33
    
34
    DDRB = 0xFF;
35
    DDRD = 0xFF;
36
    
37
    PORTB |= ((1<<6) | (1<<7));
38
    PORTD |= ((1<<5) | (1<<6) | (1<<7));
39
}
40
41
42
void Kontroll_LED (void)
43
{
44
  
45
  DDRA = 0xFF;
46
  PORTA &= ~(1<<3);
47
}
48
49
50
/*----------------------------------------------------------------------------
51
                            My Variables
52
----------------------------------------------------------------------------*/
53
uint32_t i=0;
54
uint32_t count=0;
55
uint16_t My_Delta=0;
56
/*----------------------------------------------------------------------------
57
                                prototypes
58
----------------------------------------------------------------------------*/
59
extern void touch_measure(void);
60
extern void touch_init( void );
61
extern void init_system( void );
62
extern void init_timer_isr(void);
63
extern void set_timer_period(uint16_t);
64
65
66
/*----------------------------------------------------------------------------
67
                            Structure Declarations
68
----------------------------------------------------------------------------*/
69
70
/*----------------------------------------------------------------------------
71
                                   Touch Delta
72
----------------------------------------------------------------------------*/
73
74
/*void my_touch_data (void)
75
{
76
  
77
  if (qt_measure_data.channel_signals[CHANNEL_0]<30u)
78
    { My_Delta = qt_measure_data.channel_signals[CHANNEL_0];}
79
  else{ My_Delta = 100;}
80
  
81
}
82
83
/*----------------------------------------------------------------------------
84
                                global variables
85
----------------------------------------------------------------------------*/
86
/* Timer period in msec. */
87
uint16_t qt_measurement_period_msec = QT_MEASUREMENT_PERIOD_MS;
88
uint16_t time_ms_inc=0;
89
extern uint8_t my_sensor_delta;
90
/*----------------------------------------------------------------------------
91
                                Delay Loop
92
----------------------------------------------------------------------------*/
93
/*void delay (void)
94
{ 
95
  count = (4*65536);
96
  for (i=0;i<count;i++);
97
  
98
}
99
100
/*----------------------------------------------------------------------------
101
                                static variables
102
----------------------------------------------------------------------------*/
103
104
/* flag set by timer ISR when it's time to measure touch */
105
volatile uint8_t time_to_measure_touch = 0u;
106
107
/* current time, set by timer ISR */
108
volatile uint16_t current_time_ms_touch = 0u;
109
110
/*============================================================================
111
Name    :   main
112
------------------------------------------------------------------------------
113
Purpose :   main code entry point
114
Input   :   n/a
115
Output  :   n/a
116
Notes   :
117
============================================================================*/
118
119
int main( void )
120
{ 
121
  
122
   /* initialise host app, pins, watchdog, etc */
123
    init_system();
124
125
    /* configure timer ISR to fire regularly */
126
    init_timer_isr();
127
128
  /* Initialize Touch sensors */
129
  touch_init();
130
131
    /* enable interrupts */
132
    __enable_interrupt();
133
  
134
    /* loop forever */
135
    for( ; ; )
136
    {
137
    extern void Transmit_Delta(void);
138
        touch_measure();
139
    
140
    Kontroll_LED();
141
142
      
143
  
144
    if( my_sensor_delta > 1u){
145
      
146
      LED_ON();
147
      }
148
      
149
    else {  LED_OFF();
150
        
151
        
152
        }
153
    
154
    
155
    /*  Time Non-critical host application code goes here  */
156
  
157
                  }
158
  
159
}

: Bearbeitet durch User
von Flo (Gast)


Lesenswert?

Ach ja, Ich Flashe mit JP1 und lese dann mit JP2 aus.

Es soll aber wenn es fertig ist nur über den XF2J Betrieben werden

von Karl H. (kbuchegg)


Lesenswert?

Zuallererst mal haben wir wieder mal das übliche:
Keine Blockkondensatoren an den Versorgungsspannungsanschlüssen.
Praktisch jeder Thread, in dem von seltsamen Problemen berichtet wird, 
bzw. in dem jemand bittet über seine Schaltung drüber zu schauen, hat 
immer wieder das gleiche grundsätzliche Problem: keine 
Blockkondensatoren. Die sind nicht da, damit die Kondensatorindustrie 
auch etwas verdient! Die haben eine Funktion!


Das hier
1
void LED_ON (void) {
2
  
3
  DDRB = 0xFF;
4
  DDRD = 0xFF;

no.
erstens willst du nicht ständig am DDRx Register rumfummeln, sondern das 
macht man genau einmal, nämlich am Programmanfang.

Zweitens ist das 'Ich setze einfach mal alle Pins auf Ausgang' nicht die 
Methode der Wahl. WEnn du von einem Port nur 3 Pins auf Ausgang 
brauchst, weil dort 3 LED hängen, dann schalte gefälligst auch nur die 3 
Ausgänge auf Ausgang und lass die anderen Pins in Ruhe! Andere 
Programmteile verlassen sich unter Umständen darauf, dass sie die 
Datenrichtung für 'ihre' Pins einstellen und anderer Code ihnen da nicht 
ins Handwerk pfuscht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Zuallererst mal haben wir wieder mal das übliche:
> Keine Blockkondensatoren an den Versorgungsspannungsanschlüssen.
> Praktisch jeder Thread, in dem von seltsamen Problemen berichtet wird,
> bzw. in dem jemand bittet über seine Schaltung drüber zu schauen, hat
> immer wieder das gleiche grundsätzliche Problem: keine
> Blockkondensatoren. Die sind nicht da, damit die Kondensatorindustrie
> auch etwas verdient! Die haben eine Funktion!

Oder sollen C4 und C3 die Blockkondensatoren darstellen?
In dem Fall, und wenn die baulich an den µC-Pins sitzen, nehm ich alles 
zurück und behaupte das Gegenteil.

von Flo (Gast)


Lesenswert?

Hallo karl Heinz,

danke für deine Antwort

Karl Heinz schrieb:
>
> Zweitens ist das 'Ich setze einfach mal alle Pins auf Ausgang' nicht die
> Methode der Wahl. WEnn du von einem Port nur 3 Pins auf Ausgang
> brauchst, weil dort 3 LED hängen, dann schalte gefälligst auch nur die 3
> Ausgänge auf Ausgang und lass die anderen Pins in Ruhe!

Ich hatte vorher nur die Pins die ich brauche auf Ausgang, allerdings 
funktionierte dann das Auslesen nichtmehr, nachdem ich alle als Ausgang 
definiert hatte funktionierte das wieder.
Ich werd das dann im Programm weiter nach oben schieben.

C3 und C4 sind zwischen VCC und Ground geschalten und auch physikalisch 
nahe am µC.

Kannst du mir erklären warum es funktioniert wenn der Analyzer läuft, 
aber nur mit Spannung nicht? Wie gesagt, ich hatte den verdacht dass die 
interne Clock nicht angeschaltet ist, scheint aber flasch zu sein.

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:

> Ich hatte vorher nur die Pins die ich brauche auf Ausgang, allerdings
> funktionierte dann das Auslesen nichtmehr

das wird aber nicht besser, wenn du der QTouch Lib ins Handwerk pfuscht.

>, nachdem ich alle als Ausgang
> definiert hatte funktionierte das wieder.

Wenn überhaupt, dann war das Zufall.
Das es in Wirklichkeit nicht funktioniert, siehst du ja. Sonst würdest 
du nicht fragen.


> C3 und C4 sind zwischen VCC und Ground geschalten und auch physikalisch
> nahe am µC.

Gut. Dann nehm ich alles zurück.

> Kannst du mir erklären warum es funktioniert wenn der Analyzer läuft,
> aber nur mit Spannung nicht? Wie gesagt, ich hatte den verdacht dass die
> interne Clock nicht angeschaltet ist, scheint aber flasch zu sein.

Weil dein Analyzer als Messgerät auch irgendwie das Messobjekt 
verändert. Wo genau ist der denn angeschlossen?
Wie sieht die Anbindung der kapazitiven Sensoren aus?


Hast du deinen Tiny schon mal ohne diesem QTouch einem Test unterzogen?
Einfach nur 2 LED blinken lassen und sonst nichts? Läuft er dann? 
Sozusagen ein "ist die grundsätzliche Hardware eigentlich in 
Ordnung"-Test?

: Bearbeitet durch User
von Flo (Gast)


Lesenswert?

> das wird aber nicht besser, wenn du der QTouch Lib ins Handwerk pfuscht.

Ich weis es leider nicht besser, wenn ich nur die benötigten Pins für 
die LEDs als Ausgang schalte kann ich keine Auswertung mit dem QTouch 
Analyzer machen.

> Wenn überhaupt, dann war das Zufall.
> Das es in Wirklichkeit nicht funktioniert, siehst du ja. Sonst würdest
> du nicht fragen.
>
> Weil dein Analyzer als Messgerät auch irgendwie das Messobjekt
> verändert. Wo genau ist der denn angeschlossen?
> Wie sieht die Anbindung der kapazitiven Sensoren aus?
>

Nur um sicherzugehen dass wir vom selben sprechen, mit Analyzer meine 
ich das Auswerttool von Atmel Studio das mir auch die Intensität des 
Touchs ausgibt. Keinen Spektrumanalyzer.

> Hast du deinen Tiny schon mal ohne diesem QTouch einem Test unterzogen?
> Einfach nur 2 LED blinken lassen und sonst nichts? Läuft er dann?
> Sozusagen ein "ist die grundsätzliche Hardware eigentlich in
> Ordnung"-Test?

Ja das habe ich und darauf begründet sich auch meine Frage. Wenn ich den 
QT weglasse leuchtet nur die Kontroll LED, sonst passiert garnichts.

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:

> Wenn ich den
> QT weglasse leuchtet nur die Kontroll LED, sonst passiert garnichts.

Dann lass uns erst mal den Teil abklären.

Testprogramm
1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <utils/delay.h>
5
6
#define LED1  PA3
7
#define LED2  PB6
8
9
int main()
10
{
11
  DDRA |= ( 1 << LED1 );
12
  DDRB |= ( 1 << LED2 );
13
14
  PORTA &= ~( 1 << LED1 );
15
  PORTB &= ~( 1 << LED2 );
16
17
  _delay_ms( 1000 );
18
19
  PORTB |= ( 1 << LED2 );
20
21
  while( 1 )
22
  {
23
    PORTA |= ( 1 << LED1 );
24
    _delay_ms( 500 );
25
    PORTA &= ~( 1 << LED1 );
26
    _delay_ms( 1000 );
27
  }
28
}

erwartetes Verhalten:
Wenn der µC resettet wird (entweder nach dem Brennen oder nach dem 
Anlegen der Betriebsspannung) leuchten die beiden LED, die in deinem 
Schaltplan mit LED1 und LED2 bezeichnet sind.

Nach 1 Sekunde geht LED2 aus und darf danach nie wieder aufleuchten, 
während LED1 zu blinken anfängt. Die Dunkelphasen sind ca. 0.5 Sekunden 
lang, die Hellphasen der Led sind ca 1 Sekunde lang.


Und das darf sich nicht ändern. Egal ob du einen Analyser drann hast 
oder nicht. Weder darf LED1 zu blinken aufhören, noch darf LED2 erneut 
aufleuchten (es sei denn du nimmst den Strom weg und legst ihn wieder 
an). Auch müssen die Zeiten ziemlich gut stimmen (ich geh mal davon aus, 
dass du nicht an den Fuses gespielt hast und der Tiny noch immer auf 
1Mhz eingestellt ist)

Wenn das so ist, dann ist dein µC einsatzbereit und die Hardware so 
gesehen erst mal in Ordnung. Probier alles mögliche aus, was du in 
Verdacht hast, dass es den µC beeinflussen könnte. Weder darf das 
Blinken aufhören oder sich verhaspeln, noch darf LED2 erneut 
aufleuchten.

: Bearbeitet durch User
von Flo (Gast)


Lesenswert?

Habe den Code von dir jetz mal draufgeladen, allerdings erkennt er bei 
mir die
> #include <utils/delay.h>

nicht. hab das rausgetan und die delays durch entsprechende 
"for-schleifen" ersetzt. Ich weis. ist nicht so schön wie die interrupts 
:D

uint16_t i;

for(i=0;i<65000;i++;)

es tut sich leider garnichts, weder mit dem QT noch ohne

Hab zwischenzeitlich nen neuen µC draufgepackt weil ich mich durch 
rumprobieren ausgeschlossen hab :D

von delay (Gast)


Lesenswert?

Flo schrieb:
>> #include <utils/delay.h>
sollte bestimmt
#include <util/delay.h>
heißen, dort ist wohl ein s dazwischen gerutscht.

von Karl H. (kbuchegg)


Lesenswert?

delay schrieb:
> Flo schrieb:
>>> #include <utils/delay.h>
> sollte bestimmt
> #include <util/delay.h>
> heißen, dort ist wohl ein s dazwischen gerutscht.

:-)
Ja das passiert mir öfter.

von Flo (Gast)


Lesenswert?

Stimmt, Ja.

Funktioniert leider trotzdem nichts :/

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:
> Habe den Code von dir jetz mal draufgeladen, allerdings erkennt er bei
> mir die
>> #include <utils/delay.h>
>
> nicht. hab das rausgetan und die delays durch entsprechende
> "for-schleifen" ersetzt. Ich weis. ist nicht so schön wie die interrupts
> :D

Sind auch keine Interrupts.
_delay_ms expandiert ebenfalls zu Warteschleifen.
Nur funktionieren die dann auch, weil man dem Compiler verbietet sie 
wegzuoptimieren.

Also. Die _delay_ms wieder rein, und den Directory Namen korrigieren.

von Flo (Gast)


Lesenswert?

Hab ich gerade gemacht, hat sich jetzt ein bisschen überschnitten. 
Leuchtet leider nichts :/

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:
> Stimmt, Ja.
>
> Funktioniert leider trotzdem nichts :/

Dann ist aber was mächtig faul im Staate Dänemark mit deiner Hardware
Denn ein noch einfacheres Testprogramm kann es kaum geben.

von Karl H. (kbuchegg)


Lesenswert?

Also: ganzen Prozess nochmal durchgehen.

Hast du das richtige Hex-File gebrannt?
Gibt es vom Brenner eine Fehlermeldung?
Kannst du das gebrannte Programm vom µC wieder auslesen und stimmt das 
mit dem Hex-File überein? (die Verify Funktion im Brennprogramm)
Welcher Pegel liegt am Reset-Pin des Tiny an?
Sind alle Versorgunsspannungen am Tiny dort wo sie hingehören?
Sind vielleicht die LED verkehrt rum eingelötet?

Sichtung der Platine: Kurzschlüsse? Leiterbahnunterbrechungen?

(Als letztes: Wenn möglich, alles bis auf die beiden LED und ihre 
Widerstände  mal runternehmen, so dass garantiert nix anderes den µC 
beeinflussen kann)

: Bearbeitet durch User
von Flo (Gast)


Lesenswert?

Karl Heinz schrieb:
> Also: ganzen Prozess nochmal durchgehen.
>
> Hast du das richtige Hex-File gebrannt?

Ja, ich hab extra nachgesehen ob er das .hex oder das.elf auswählt

> Gibt es vom Brenner eine Fehlermeldung?

Nein,
Erasing device...OK
Programming Flash...OK
Verify Flash...OK

> Kannst du das gebrannte Programm vom µC wieder auslesen und stimmt das
> mit dem Hex-File überein? (die Verify Funktion im Brennprogramm)

Verify funktioniert. Wenn ich das HEX mit Read auslese und es im 
Texteditor vergleiche, sieht es für mich so aus als hätte er das ganze 
"aufgefüllt" mit vielen FFFFFF.
Die ersten 10 Zeilen sind identisch, das Original endet hier.

> Welcher Pegel liegt am Reset-Pin des Tiny an?

3,3V

> Sind alle Versorgunsspannungen am Tiny dort wo sie hingehören?

VCC und AVCC sind an 3,3V

> Sind vielleicht die LED verkehrt rum eingelötet?

Nein, hab ich extra nochmal überprüft
>
> Sichtung der Platine: Kurzschlüsse? Leiterbahnunterbrechungen?

Hab jetzt fragwürdige stellen nochmal nachgelötet (zwischen den Beinchen 
des µC)

> (Als letztes: Wenn möglich, alles bis auf die beiden LED und ihre
> Widerstände  mal runternehmen, so dass garantiert nix anderes den µC
> beeinflussen kann)

Hab jetzt nochmal ein komplett jungräuliches Projekt erstellt nur mit 
deinem Code drin. Jetz funktionierts.

Es passiert folgendes.

Sobald spannung anliegt Leuchten LED1 und LED2 gleichzeitig für ca 0,5-1 
sek, danach erlischt LED2. LED1 blinkt etwa mit 1HZ.

von Flo (Gast)


Lesenswert?

Also das Testprogramm geht jetzt.

habe gerade nochmal versucht in meinem Programm nur die Pins die ich 
auch wirklich brauche als Ausgang zu definieren sowie die Pins die die 
SPI Schnittstelle richtig zu definieren. hat allerdings keinen 
sichtbaren Erfolg gebracht. Der µc bleibt nachwievor einfach in seinem 
Zustand sobald man das Auslesen beendet. Mit Spannung alleine Startet er 
erst garnicht. nur die Kontroll-LED leuchtet.

von Karl H. (kbuchegg)


Lesenswert?

> Hab jetzt nochmal ein komplett jungräuliches Projekt erstellt nur mit deinem 
Code drin. Jetz funktionierts.


Das ist dubios.
Das legt bei mir die Vermutung nahe, dass in deinem ursprünglichen 
Projekt zb der falsche Prozessor eingestellt war.

von Flo (Gast)


Lesenswert?

Soo, ich habe jetz wieder ein Jungfräuliches TouchSensor Programm vom 
Assistenten generieren lassen und einfach eine einzelne LED blinken 
lassen.

Jetz hat sich herrausgestellt dass ich diese LED niewieder löschen kann. 
Hab den Chip zwar jetz schon mindestens 10x gelöscht bevor ich ihn neu 
beschrieben habe, aber die LED bleibt auf dauerlicht gestzt, obwohl der 
CODE auskommentiert ist. :/ wird irgendwie immer seltsamer

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:
> Soo, ich habe jetz wieder ein Jungfräuliches TouchSensor Programm vom
> Assistenten generieren lassen

Wie umfangreich ist dieses QTouch Zeugs?
Wenns nicht zu umfnagreich ist, dann stell doch bitte mal hier ein.
Ich verwende dieses Zeugs nicht (und auch keinen Assistenten :-), daher 
kann ich dazu nicht viel sagen.

Aber ich kann mir mal ansehen, was der Assistent da eigentlich so alles 
erzeugt :-)

von Flo (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab das ganze Projekt jetz mal gepackt und angehängt. Ich kann ncht 
ganz beurteilen wie umfangreich das ist :D die Main hab ich ja schon 
gepostet.
In diesem projekt hab ich jetzt nur die blink LED drin. die touch 
erkennung habe ich in einem anderen Projekt aus der QDEBUG.c genommen, 
aus "Transmit_delta".

von Karl H. (kbuchegg)


Lesenswert?

2 Dinge sind mir in deinem Code aufgefallen.

Du hast zwar eine schöne Funktion Output_Settings, rufst sie aber nie 
auf
1
int main( void )
2
{
3
4
   /* initialise host app, pins, watchdog, etc */
5
    init_system();
6
7
    /* configure timer ISR to fire regularly */
8
    init_timer_isr();
9
10
  /* Initialize Touch sensors */
11
  touch_init();
12
13
    /* enable interrupts */
14
    __enable_interrupt();
15
16
    /* loop forever */
17
    for( ; ; )

du musst sie schon auch mal irgendwo aufrufen, damit sie einen Effekt 
hat und die Pins auf Ausgang schaltet.

Das andere ist.
In touch.h, ganz unten
1
/******************************************************************************
2
*   Debug Interface Settings
3
******************************************************************************/
4
5
6
#define _DEBUG_INTERFACE_
7
8
/*  SPI Master  */
9
#define  QDEBUG_SPI

d.h. da ist Debugging aktiviert und das Debugging findet auf der SPI 
statt. Sicher, dass du das willst? Denn dann gibt der Code alle 
möglichen Statusmeldungen über die eingestellte Schnittstelle aus. Was 
grundsätzlich nicht schlecht ist, aber natürlich auch wieder eine 
weitere Fehlerquelle darstellt.

Ich würde mich mal in touch.c
1
void touch_measure(void)
2
{
3
4
  /*status flags to indicate the re-burst for library*/
5
    static uint16_t status_flag = 0u;
6
    static uint16_t burst_flag = 0u;
7
8
    if( time_to_measure_touch )
9
        {
10
11
            /*  clear flag: it's time to measure touch  */
12
            time_to_measure_touch = 0u;
13
14
            do {
15
        #ifdef _DEBUG_INTERFACE_
16
            TIMESTAMP0;
17
        #endif
18
19
                /*  one time measure touch sensors    */
20
                status_flag = qt_measure_sensors( current_time_ms_touch );
21
22
        #ifdef _DEBUG_INTERFACE_
23
            TIMESTAMP2;
24
        #endif
25
26
                burst_flag = status_flag & QTLIB_BURST_AGAIN;
27
                
28
                #ifdef _DEBUG_INTERFACE_
29
                    /* send debug data */
30
                    QDebug_SendData(status_flag);
31
                    /* Process commands from PC */
32
                  QDebug_ProcessCommands();
33
                #endif
34
          
35
          #ifdef _DEBUG_INTERFACE_
36
              TIMESTAMP3;
37
          #endif
38
39
                /* Time-critical host application code goes here */
40
41
            }while (burst_flag) ;
42
43
        }
44
        
45
        #ifdef _DEBUG_INTERFACE_
46
            TIMESTAMP4;
47
        #endif
48
        
49
        /* Non-Time critical host application code goes here */
50
        
51
        #ifdef _DEBUG_INTERFACE_
52
            TIMESTAMP5;
53
        #endif
54
        /* Host sleep code goes here */
55
56
}
auf die while Schleife konzentrieren. Das ist eine potentielle 
Endlosschleife, wenn bust_flag nie FALSE wird.
Damit burst_flag FALSE werden kann, muss hier
1
                burst_flag = status_flag & QTLIB_BURST_AGAIN;
im status_flag das Bit QTLIB_BURST_AGAIN gelöscht sein.
status_flag kommt von hier
1
            status_flag = qt_measure_sensors( current_time_ms_touch );
d.h. in der Funktion würde ich mal reinschnuppern, wie da die Logik 
funktioniert.
Unglücklicherweise kann ich aber die Funktion dafür nicht finden. Ist 
die in der libavr25g1-4qt-k-0rs.a drinnen?

: Bearbeitet durch User
von Rudolph (Gast)


Lesenswert?

Flo schrieb:
> Das funktioniert alles wunderbar, jedoch nur wenn ich im
> QTAnalyzer auf Start Reading gedrückt habe.

Das klingt nach aktiviertem Debug-Code.

Der Q-Touch Composer erzeugt leider auch in der neuesten Version etwas 
merkwürdigen Code.
Zum Beispiel ist es nicht möglich, einen Quarz ungleich 8MHz zu 
benutzen, das ganze Konstrukt ist auf den RC-Oscillator abgestimmt und 
der µC wird mit 4MHz betrieben.
Wenn man versucht das zu ändern muss man ziemlich tief im Code graben 
und dann funktionieren entweder die Buttons nicht mehr oder die 
Debug-Ausgabe oder gleich beides.
Und das mit ansonstem nackten Projekt, ohne eigenen Code.

Dokumentation findet genau wie beim ASF quasi nicht statt.

Ich hatte Atmel schon angeschrieben deshalb, die Antworten lassen mich 
aber stark vermuten, dass dort meine Fragen nicht verstanden wurden da 
ich auf nochmalige Nachfrage mit quoten derer Mail als Bezug erneut die 
gleiche nutzlose Antwort erhalten habe die ein wenig an der Frage vorbei 
ging.
Ist jetzt alles schon wieder ein paar Monate her und ich hatte mich auch 
nur damit beschäftigt um einen Kollegen zu unterstützen.

Aber Bock habe ich auf den Kram nicht mehr wirklich, gezwungen zu sein 
den µC auf 4MHz zu benutzen finde ich nicht wirklich komisch.
Und die nächste Version vom Q-Touch Composer hat das dann nicht etwa 
verbessert, der fragliche Code wurde noch schwerer zu finden. :-(

von Rudolph (Gast)


Lesenswert?

Ach ja, wir haben ein Board mit einem Mega88PA und eines mit einem 
Mega164PA aufgebaut.
Beim Mega88PA erfolgt die Debug-Ausgabe per TWI, der Q-Touch Composer 
kann den Mega164PA nur per Software-SPI Debug-Ausgaben machen.

Wobei man villeicht noch erklären muss das Debug-Ausgaben sich auf die 
Messwerte der Touch-Sensoren bezieht, das kann man mit dem Q-Touch 
Analyser visualisieren wenn man denn das QT600-Kit hat das diese Daten 
auf den USB umsetzt.

Ich finde das Zeug reichlich halbgar.

von Uwe (Gast)


Lesenswert?

> /* Process commands from PC */
>                  QDebug_ProcessCommands();

Wartet der µC hier auf eine Antwort ? (Die niemals kommt wenn du das 
Kabel abziehst !)
Am besten mal den Debugmode ausschalten und dann versuchen das Kabel 
abzuziehen.

von Flo (Gast)


Lesenswert?

Vielen Dank für die vielen Tipps, werd mich heute wieder stark 
dahinterklemmen und eure Tipps durcharbeiten, gebe dann wieder 
Rückmeldung.

Es ist schon so, dass Ich mit dem Qtouch Analyzer die Messwerte des 
Touchsensors visualisiere. Das ist aber nur jetzt am anfang wichtig. 
Später wenn ich das Ding eingebaut habe und es funktioniert 
interessieren mich ja die Werte nichtmehr, nur die Funktion. Werde also 
versuchen den Debug-mode wie von euch beschrieben abzuschalten.

Viele Grüße, Flo

von Flo (Gast)


Lesenswert?

Soweit ich das jetz sehe liegt das Problem in der Auswertung des 
Touches, die meiner Ansicht nach nur aktiv ist wenn der µC im 
Debug-Modus ist. Habe die Kontroll-LED mal auf blinken gemacht und nur 
vom Labornetzgerät die 3,3V angelegt. Das funktioniert!

Bis jetzt habe ich die Touch erkennung des generierten Codes genommen. 
Habt ihr eine Idee wie ich das anders machen kann? Habe die Variable 
delta aus QDebug.c dazu verwendet.

von Flo (Gast)


Lesenswert?

Bin langsam echt am verzweifeln. Das muss doch gehen. Steuert die SPI 
schnittstelle evtl meinen µC und enabled die Touch-auswertung?

von Flo (Gast)


Lesenswert?

Rudolph schrieb:

> Wobei man villeicht noch erklären muss das Debug-Ausgaben sich auf die
> Messwerte der Touch-Sensoren bezieht, das kann man mit dem Q-Touch
> Analyser visualisieren wenn man denn das QT600-Kit hat das diese Daten
> auf den USB umsetzt.

Ich verwende genau was du schreibst. Kann es sein dass die Messwerte nur 
verfügbar sind wenn der Analyzer angeschlossen ist? Ich verwende nämlich 
für meine Touchanzeige eine Variable aus der QDebug.c

von Rudolph (Gast)


Lesenswert?

Habs nicht mehr im Kopf, da gibt es aber eine Funktion mit der man den 
Status von Buttons abfragen kann.

Also Delta ist ja nicht ganz richtig, Du willst ja wissen ob der Taster 
über der eingestellten Schwelle ist.

Das ganze Geraffel scheint mir im wesentlich Marketing zu sein, 
ernsthaft scheint man sich bei Atmel damit nicht zu beschäftigen.

Genauso wie diese undokumentierte Sammlung von inkonsistentem Code die 
Atmel ASF nennt.

Das könnte richtig hilfreich sein.

von Flo (Gast)


Lesenswert?

Rudolph schrieb:
> Habs nicht mehr im Kopf, da gibt es aber eine Funktion mit der man den
> Status von Buttons abfragen kann.
>
> Also Delta ist ja nicht ganz richtig, Du willst ja wissen ob der Taster
> über der eingestellten Schwelle ist.


Stimmt, delta ist nicht ganz richtig, das Delta wird anscheinend nur 
gebildet wenn der Debugmodus aktiv ist.


Ich hab  jetzt nochmal ganz viel rumprobiert und es zum laufen gekriegt 
so wie ich es will. Es funktioniert jetz mir einer konstruktion aus 
Status_Flag und Burst_Flag.

Ich möchte mich bei allen die mir geholfen haben nochmals herzlichst 
bedanken. Danke, dass ihr euch die Zeit genommen habt und für eure mühe 
:)

Von meiner Seite aus kann man das Thema abschließen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.